游戏开发论坛

 找回密码
 立即注册
搜索
查看: 10741|回复: 9

如何从世界坐标转换到屏幕坐标?

[复制链接]

16

主题

114

帖子

114

积分

注册会员

Rank: 2

积分
114
发表于 2007-5-9 10:01:00 | 显示全部楼层 |阅读模式
我想让角色头上定这个血条,血条直接用xyzrhw 屏幕坐标画。

已经得到了 worldViewProj矩阵。
                     //得到世界坐标为g_vec0的投影坐标。
                g_vecshow.x = g_vec0.x * worldViewProj._11
                            +g_vec0.y * worldViewProj._21
                            +g_vec0.z * worldViewProj._31
                               +g_vec0.w * worldViewProj._41;

                g_vecshow.y = g_vec0.x * worldViewProj._12
                           +g_vec0.y * worldViewProj._22
                            +g_vec0.z * worldViewProj._32
                            +g_vec0.w * worldViewProj._42;
                     //从投影坐标转换成屏幕坐标
                g_vecshow.x = ( 1.f+g_vecshow.x)* SCREENWIDTH/2;
                g_vecshow.y = ( 1.f-g_vecshow.y)* SCREENHEIGHT/2;

但是最终得到的屏幕坐标不对的,我想了好久不知道为什么,也不知道那里错了。请教大家了。。。

9

主题

249

帖子

260

积分

中级会员

Rank: 3Rank: 3

积分
260
发表于 2007-5-9 14:14:00 | 显示全部楼层

Re:如何从世界坐标转换到屏幕坐标?

我在想角色头上的血条是用xyzrhw画的吗?(猜的)

16

主题

114

帖子

114

积分

注册会员

Rank: 2

积分
114
 楼主| 发表于 2007-5-9 15:21:00 | 显示全部楼层

Re:如何从世界坐标转换到屏幕坐标?

是的,打算这么干,而不用公告板。

36

主题

1047

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
发表于 2007-5-10 13:45:00 | 显示全部楼层

Re:如何从世界坐标转换到屏幕坐标?

要理解 xyzrhw 坐标系统是什么。

16

主题

114

帖子

114

积分

注册会员

Rank: 2

积分
114
 楼主| 发表于 2007-5-10 17:19:00 | 显示全部楼层

Re:如何从世界坐标转换到屏幕坐标?

"要理解 xyzrhw 坐标系统是什么。"
就是是屏幕坐标,无须再做world view project 变换。

4

主题

41

帖子

41

积分

注册会员

Rank: 2

积分
41
发表于 2008-1-16 16:44:00 | 显示全部楼层

Re:如何从世界坐标转换到屏幕坐标?

我也困惑

6

主题

60

帖子

60

积分

注册会员

Rank: 2

积分
60
发表于 2008-6-6 14:13:00 | 显示全部楼层

Re: 如何从世界坐标转换到屏幕坐标?

用广告牌方便点

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2008-6-7 23:46:00 | 显示全部楼层

Re:如何从世界坐标转换到屏幕坐标?

void XScreen:rawTextToWorld(PCSTR pMsg, float x, float y, float z,
                                         int rect_width, int  rect_height, D3DCOLOR color,
                                         int topOffset, int leftOffset, int vAlign, int hAlign)
{
        D3DXVECTOR3 p(0.0f, 0.0f, 0.0f);

        D3DXMATRIX worldMat;
        D3DXMatrixIdentity(&worldMat);
        worldMat._41 = x;
        worldMat._42 = y;
        worldMat._43 = z;

        D3DXMATRIX viewMat;
        D3DXMATRIX projectMat;
        D3DVIEWPORT9 viewPortMat;

        gd3dDevice->GetTransform(D3DTS_VIEW, &viewMat);
        gd3dDevice->GetTransform(D3DTS_PROJECTION, &projectMat);
        gd3dDevice->GetViewport(&viewPortMat);


        D3DXVECTOR3 s;
        //获取3D空间的P点投影到屏幕上的s点
        D3DXVec3Project(&s, &p,
                (D3DVIEWPORT9 *)&viewPortMat,
                (const D3DXMATRIX*)&projectMat,
                (const D3DXMATRIX*)&viewMat,
                (const D3DXMATRIX*)&worldMat);
        //printf("%s  %f %f %f \r\n", pMsg, s.y, s.x, s.z);
        if(s.z>0 && s.z <= 1.0f) //如果在可见范围只外投影的值和原点的z距离会大于1.0f
        DrawText(pMsg, (int)s.y, (int)s.x, rect_width, rect_height, color,topOffset,leftOffset,  vAlign, hAlign);
}

这是我以前写的一个方法,对lz应该有用,画图写字都没问题,原理一样,关键是计算投影坐标

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2008-6-8 20:42:00 | 显示全部楼层

Re:如何从世界坐标转换到屏幕坐标?

(视口变换·投影变换·观察变换)-1

由于向量的行列性导致变换矩阵的相乘顺序不同一。
故抽象地用变换来表示。

33

主题

544

帖子

554

积分

高级会员

Rank: 4

积分
554
发表于 2008-6-8 21:41:00 | 显示全部楼层

Re:如何从世界坐标转换到屏幕坐标?

世界坐标->相机坐标->透视坐标->屏幕坐标
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-22 08:02

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表