一个关于d3d的camera space的问题

popy007 2003-08-19 11:20:48

各位高手:
D3DXVec3Subtract(&ZAxis, pAt, pEye);
是pAt-pEye还是pEye-pAt???

还有就是不论上面的相减顺序如何,下面这样的camera space岂不是做成了右手系??
// Normalize the z basis vector.
D3DXVec3Normalize(&ZAxis, &ZAxis);

// Compute the orthogonal axes from the cross product of the gaze
// and the pUp vector.
D3DXVec3Cross(&XAxis, pUp, &ZAxis);
D3DXVec3Normalize(&XAxis, &XAxis);
D3DXVec3Cross(&YAxis, &ZAxis, &XAxis);

这样在做对world space旋转的时候方向应该就不对了。我是这么理解的,但肯定是我错了,因为d3d就是按照上面那样做的,且正确。希望高手指教!
...全文
114 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
popy007 2003-08-21
  • 打赏
  • 举报
回复
chenlee()

叉乘的结果都是符合右手螺旋定则的,但叉乘公式对于不同的坐标系是需要改变的。

a(x1,y1,z1)
b(x2,y2,z2)

左手系

| i j k |
a×b=| x2 y2 z2 | (i,j,k单位向量)
| x1 y1 z1 |
右手系
| i j k |
a×b=| x1 y1 z1 | (i,j,k单位向量)
| x2 y2 z2 |

你可以代值验证,或者你可以察看有关书籍。

叉乘公式:

| i j k |
a×b=| x1 y1 z1 | (i,j,k单位向量)
| x2 y2 z2 |

一般是根据右手坐标系定义的。

比如现在你在右手坐标系下,用x(1,0,0) x z(0,0,1)=
| i j k |
| 1 0 0 | = -j = (0, -1, 0) 此时x,z,xxz符合右手螺旋定则
| 0 0 1 |
但如果你在左手坐标系下,还是用x(1,0,0) x z(0,0,1)=
| i j k |
| 1 0 0 | = -j = (0, -1, 0) 此时x,z,xxz就不符合右手螺旋定则了
| 0 0 1 |

所以要变成

| i j k |
| 0 0 1 | = j = (0, 1, 0) 才能使x,z,xxz符合右手螺旋定则
| 1 0 0 |

这就是左右手叉乘公式的区别所在

chenlee 2003-08-20
  • 打赏
  • 举报
回复
> 回复人: happy__888([顾问团]寻开心) ( ) 信誉:110 2003-08-19 17:27:00 得分:0
>
>
> 单独一个z乘符号不够,xyz都要乘-1
>
> 其实你自己使用两个已知向量测试一下就知道了,例如
> 第一个向量(1 0 0)
> 第二个向量(0 1 0)
> 看但得到的结果是右手:(0 0 1 ) 还是左手:(0 0 -1)

绝对错误啊!

不管是左手还是右手系,查乘的算法是不会遍的,
(1,0,0) X (0,1,0) 恒等于 (0,0,1)


popy007 2003-08-20
  • 打赏
  • 举报
回复
happy__888([顾问团]寻开心)

我明白了,我的世界坐标是左手的,而这个叉乘公式是右手的,所以我要么把

公式变为

| i j k |
a×b=| x2 y2 z2 | (i,j,k单位向量)
| x1 y1 z1 |

要么用b x a,呵呵,原来是我对叉乘的理解还不透彻,现在全明白了!Thank you for your reminding!

谢谢各位的参与!
寻开心 2003-08-20
  • 打赏
  • 举报
回复
至于你的结果有符号问题,是因为右手坐标系和左手坐标系本来就是差一个符号的关系
寻开心 2003-08-20
  • 打赏
  • 举报
回复
叉乘公式是右手的。
D3DVec3Cross()里面向量也是按照右手计算的没错

前面的计算步骤是按照右手的顺序来的
但是这和左手坐标系冲突啊。

你的世界坐标系是左手的还是右手的啊?
寻开心 2003-08-19
  • 打赏
  • 举报
回复
D3DXVec3Cross()就是按照左手的顺序来生的啊。
D3DXVec3Cross(&YAxis, &ZAxis, &XAxis);

Y向上,Z朝向屏幕里面,X朝向右侧就是左手系的啊。

定义差积的时候,可以按照左手,也可以按照右手来处理,D3D是左手的。

ptAT-ptEye得到的是视向量
popy007 2003-08-19
  • 打赏
  • 举报
回复

这么说吧,按照d3d,最后的view matrix应该是这样的,
[ux vx nx 0]
[uy vy ny 0]
[uz vz nz 0]
[-(c.u) -(c.u) -(c.n) 1]

其中向量u,v,n是由照相机在world space中的位置Eye、看向的一点LookAt和world space中的
“上”vup,一般情况是"(0,1,0)"决定的。我没有用D3DXVec3LookAtLH()来做这个
view matrix,我自己计算这个matrix,所以要得到u,v,n,相机的位置Eye是知道的。我不用d3d的左手叉乘。

我按照叉乘的公式:


| i j k |
a×b=| x1 y1 z1 | (i,j,k单位向量)
| x2 y2 z2 |

a(x1,y1,z1),b(x2,y2,z2),a x b=(y1z2-z1y2)i+(z1x2-x1z2)j+(x1y2-y1x2)k
做右手的叉乘(a,b,axb这时符合右手系对吗?)

我首先用LookAt-Eye得到n,
然后用n x vup 得到u,
最后用u x n 得到v

u,v,n单位化

接着把他们填充到上面的矩阵中形成view matrix。

我试着用这个矩阵变换一个world space中的点,但发现得到camera space中的点的

的x坐标是相反的(因该在x的位置,变成了-x)。

我就认为上面我有疑问的叉乘公式是左手系的,

就按左手系的求了一边u,v,n,结果正确。这样我就不明白了,

难道上面的叉乘公式

| i j k |
a×b=| x1 y1 z1 | (i,j,k单位向量)
| x2 y2 z2 |

是左手系的吗?
寻开心 2003-08-19
  • 打赏
  • 举报
回复
单独一个z乘符号不够,xyz都要乘-1

其实你自己使用两个已知向量测试一下就知道了,例如
第一个向量(1 0 0)
第二个向量(0 1 0)
看但得到的结果是右手:(0 0 1 ) 还是左手:(0 0 -1)
azheng0305 2003-08-19
  • 打赏
  • 举报
回复
D3DVec3Cross()就是做了叉乘的事情啊,你看看数学上怎么乘不久可以了?
好像是这么乘的,其中我写的×就是叉乘:
a(x1,y1,z1) b(x2,y2,z2)
| i j k |
a×b=| x1 y1 z1 | (i,j,k单位向量)
| x2 y2 z2 |
将行列式的第一行展开得到坐标表达式:
a×b=(y1z2-z1y2)i+(z1x2-x1z2)j+(x1y2-y1x2)k

——————————————————————
另外,你可以看到右手系统和左手系统的区别,就是Z是相差一个负号啊,你只要在自己的数据里吧Z值加个符号,程序就可以继续用你的右手系统了。呵呵。
popy007 2003-08-19
  • 打赏
  • 举报
回复
My God!!

原来问题在D3DVec3Cross()!是按左手系,我以为是按右手!有什么办法可以看

D3DVec3Cross()代码阿??

8,303

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧