游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3173|回复: 10

高手救命!摄像机矩阵变换的问题.

[复制链接]

1

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2006-1-19 03:00:00 | 显示全部楼层 |阅读模式
如果要移动一个对象,就用坐标矩阵变换,用D3DXMatrixTranslation就行,很容易
如果我想眼睛也跟着移动,我就对视矩阵也用D3DXMatrixTranslation,结果正确
但是:旋转的时候就不行了.比如先Z坐标前进10 ,
执行:
D3DXMatrixTranslation(&matWorldXYZ,0.0f,0.0f,10.0f);//前进对象
D3DXMatrixTranslation(&matview,0.0f,0.0f,10.0f);//眼睛跟着前进
再旋转
D3DXMatrixRotationY(&matWorldXYZ,1.0f); //旋转物体
D3DXMatrixRotationY(&matview,1.0f) //眼睛跟着旋转
对象正确旋转,对象的朝向改变,

眼睛的视矩阵旋转之后错误,眼睛的指向没有变化

这样对象朝旋转后新的方向再前进的时候
眼睛却还是朝原来的一个方向前进
D3DXMatrixTranslation(&matWorldXYZ,0.0f,0.0f,10.0f);//再前进对象
D3DXMatrixTranslation(&matview,0.0f,0.0f,10.0f);//眼睛跟着前进
为什么这样呢?为什么矩阵变换之后眼睛的朝向没有变换呢?

7

主题

67

帖子

69

积分

注册会员

Rank: 2

积分
69
发表于 2006-1-19 03:56:00 | 显示全部楼层

Re:高手救命!摄像机矩阵变换的问题.

眼睛和对象是面对面的哎~!
平移可以使用一个矩阵,但是旋转就要用相反的拉!

1

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
 楼主| 发表于 2006-1-19 10:55:00 | 显示全部楼层

Re:高手救命!摄像机矩阵变换的问题.

不太明白你说的,可以详细点吗?我想让对象往哪边转,我的眼睛的朝向也转动。

我的这个例子中对象是一个坦克,本来炮口指向和眼睛看的方向是相同的。可是经过旋转之后
眼睛的朝向没有变换,坦克的炮口已经转向了,这样再前进就有问题了。

36

主题

1047

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
发表于 2006-1-19 10:57:00 | 显示全部楼层

Re:高手救命!摄像机矩阵变换的问题.

lookat 始终指向对象就行了。

1

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
 楼主| 发表于 2006-1-19 11:19:00 | 显示全部楼层

Re:高手救命!摄像机矩阵变换的问题.

对象的坐标是多少?坦克的坐标一开始是(0,0,0),以后经过N次矩阵运算,怎么知道变成了多少?

LookAt是需要指定一个D3DXVECTOR3阿。还请再指点一下.

1

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
 楼主| 发表于 2006-1-19 11:45:00 | 显示全部楼层

Re:高手救命!摄像机矩阵变换的问题.

是不是以下2个函数其中的一个?

D3DXVec3TransformCoord
Transforms a 3-D vector by a given matrix, projecting the result back into w = 1.

D3DXVec3TransformNormal
Transforms the 3-D vector normal by the given matrix.

6

主题

110

帖子

110

积分

注册会员

Rank: 2

积分
110
发表于 2006-1-20 15:15:00 | 显示全部楼层

Re:高手救命!摄像机矩阵变换的问题.

建议楼主,先看看3D变换方面的书。

1

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
 楼主| 发表于 2006-1-21 14:24:00 | 显示全部楼层

Re:高手救命!摄像机矩阵变换的问题.

一定要先叉积旋转矩阵,再叉积平移矩阵,负责旋转矩阵将在平移后的地点围绕坐标原点旋转,结果就错了。
其实就是旋转时围绕什么轴的问题
====================================================
用方向键控制,

按左键,绕Y向左旋转,
按右键,绕Y向左旋转,
按上键,前进,
按下键,后退。

如果旋转是 围绕坐标原点旋转,那么2个矩阵的结果应该都错了才对,而不是Tank的正确,眼睛的朝向错误。
根本不是旋转时围绕什么轴的问题.

叉积旋转矩阵,再叉积平移矩阵.  哪里有2次操作?按一次键执行一次操作(平移或者旋转)


建议楼主,先看看3D变换方面的书。
=============================================
每个热心帮助我的人我都很感谢,即便说的不正确,大家讨论嘛,没关系
但是我最恨不懂装懂的人,动不动说 去看书把 ,如果书上说的已经可以解决这个问题,我还来问干吗?

1

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
 楼主| 发表于 2006-1-21 14:41:00 | 显示全部楼层

Re:高手救命!摄像机矩阵变换的问题.

这个问题我最后解决了

解决的方法如下:(希望大家可以指出更好的方法。)

比如Tank原来在0,0,0
眼睛呢,眼睛的位置在0,5,-10
(Y=5因为要比tank高一点,这样可以看到Tank,Z=-10就是眼睛要靠后面一点,否则只能看到tank的炮口)
眼睛朝0,0,200 看去。

因为tank在旋转和前进的时候,它的炮口指向是正确的。关键是设定眼睛的位置和眼睛看哪里的位置。
把tank的位置矩阵平移一下,比如向上5,向后10个距离,不就是眼睛的位置了吗?
但是平移之后得到是一个矩阵,所以要从矩阵的信息里面获取 D3DXVECTOR3 的信息。
用D3DXVec3TransformCoord函数从矩阵里面获取 D3DXVECTOR3 数据,就是眼睛的位置数据
        //得到眼睛的位置。
        D3DXVec3TransformCoord(&ViewPos,&D3DXVECTOR3(0,0,0),&matTank);

同样的方法,眼睛看的位置,就是把刚才平移得到的矩阵再平移,往下平移5,
再往前面(就是按坦克的炮口指向的方向)平移200,这样又得到一个矩阵,
再从这个矩阵里面求得D3DXVECTOR3 的信息,就是眼睛看哪里的位置信息。

得到眼睛的位置和眼睛看哪里的位置信息后就再次调用

        D3DXMatrixLookAtLH(&matView, &ViewPos, //眼睛所在的位置,
                             &ViewLookAt, //眼睛向何处看去
                             &D3DXVECTOR3(0.0f, 1.0f, 0.0f)); //什么是"上"
        g_pD3DDevice->SetTransform(D3DTS_VIEW,&matView); //设置矩阵

结果正确。

1

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
 楼主| 发表于 2006-1-21 14:53:00 | 显示全部楼层

Re:高手救命!摄像机矩阵变换的问题.

我相信天外有天,人外有人,我的这样处理虽然正确,但是我总觉得这种方法比较笨拙。希望得到高人指点。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-23 06:51

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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