游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3628|回复: 3

D3D如何实现视点的旋转?

[复制链接]

11

主题

20

帖子

20

积分

注册会员

Rank: 2

积分
20
发表于 2004-11-14 00:41:00 | 显示全部楼层 |阅读模式
观察者的位置:eyeX,eyeY,eyeZ
观察目标的位置:atX,atY,atZ
向上位置:upX,upY,upZ

请问如何以较高的效率实现下面两个函数:

void rotateAroundEye(float angle,float aixX,float aixy,float aixz);

void rotateAroundAt(float angle,float aixx,float aixy,float aixz);

其中一个是绕着物体旋转眼睛的位置,另一个是饶着眼睛旋转观察物体所在的位置?
我推了半天也没推出来,只有求助各位大哥了.先谢谢先

3

主题

95

帖子

107

积分

注册会员

Rank: 2

积分
107
发表于 2004-11-14 15:16:00 | 显示全部楼层

Re:D3D如何实现视点的旋转?

你的问题很简单。不过如果让我用矩阵做,我觉得高效率就挺困难的了。我推荐使用四元数。
其实四元数你就可以等同的将其看成是3X3的旋转矩阵或4X4的位移全为0的齐次矩阵。

1、绕眼睛观察旋转物体。
首先这句话的表达就有问题。不是绕眼睛观察旋转物体。而是绕本地坐标系(摄像机的)X(Pitch)、Y(Yaw)、Z(Roll)轴旋转摄像机。这一点很简单,就简单的设置四元数旋转就行了。
2、绕着物体旋转眼睛。
这句话表达也有问题。一般的表达是使摄像机绕其它世界轴心运动或者简述为Pivot Rotation。
这个问题其实也很简单。在此我教你一个很容易理解的但是精确度不是很高的方法。
那就是:当设置了摄像机Pivot旋转的时候,首先对摄像机进行Yaw、Pitch、Roll三种旋转方式的时候,将其旋转角度取负。然后在任何一种旋转完成之后针对Pivot进行更新。下面是表述代码:
Vector3 vCamDir = GetCameraDirection();    //取当前的摄像机方向并将所有元素取负。
vCamDir = -vCamDir;
Vector3Normalise(&vCamDir);          //归一化
vCamDir *= fPivotDistance;             //乘以摄像机离旋转轴的距离(因为是绕轴心运动,所以肯定有一个运动距离,其实运动轨迹是一个圆,这个距离就是圆心距)
Vector3 vCamPos = GetCurentCameraPosition();  //获取当前的摄像机位置。即绕摄像机坐标系旋转移动等之后得到的位置。
vCamPos += vCamDir;                    //这样就得到了绕轴心运动之后的新的位置。
现在,再将这个vCamPos位置设置回去,就是摄像机的新位置了。

这个算法的精度不是特别高,但是肯定不会出现任何精度上所导致的人眼能分辨出来的问题。

如果说你连四元数概念、运算以及与矩阵之间的互相转换都不明白的话,我就没则了。而且我不推荐使用矩阵控制摄像机,虽然说四元数最后运动完了总归要化成矩阵。但是矩阵有“万向节锁”的问题,而四元数不会发生。^_^

0

主题

18

帖子

18

积分

新手上路

Rank: 1

积分
18
发表于 2004-11-14 15:33:00 | 显示全部楼层

Re:D3D如何实现视点的旋转?

一点点小问题:
不是矩阵有“万向节锁”的问题(Gimbal Lock),而是欧拉角(Euler Angle)的问题

[em5]

13

主题

978

帖子

978

积分

高级会员

Rank: 4

积分
978
发表于 2004-11-14 17:21:00 | 显示全部楼层

Re:D3D如何实现视点的旋转?

对于矩阵的运算,不能利用vertex sharder吗?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-23 07:20

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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