|
|

楼主 |
发表于 2006-4-9 10:52:00
|
显示全部楼层
Re: Re:怎样实现第三人称视角 谢谢!
nlo: Re:怎样实现第三人称视角 谢谢!
就是用 lookat() 函?底龅? 不行的?, 我想主要LZ改?camera位置方法???.
"四元??quot;主要是避免出? Gimbal Lock???.
能给大致看一下吗? 下面使我的实现思路
作出来得效果是,Camera以摄象机为中心进行旋转
而不是以物体为中心旋转
//将角度转换为弧度值进行计算
float sinangle = sin(angle*3.1415926f/180.0f);
float cosangle = cos(angle*3.1415926f/180.0f);
//观察方向的反方向
float directionX, directionY, directionZ;
directionX = eyeX - viewX;
directionY = eyeY - viewY;
directionZ = eyeZ - viewZ;
float len = (float)sqrt(directionX*directionX+directionY*directionY+directionZ*directionZ);
//新的观察方向(这里乘了一个绕任意轴的矩阵的矩阵)
(这个任意轴就是我们Up Vector lookAt函数的后三个参数)
float newDirectionX, newDirectionY, newDirectionZ;
newDirectionX = ( cosangle+(1-cosangle)*tempUpX*tempUpX )*directionX;
newDirectionX += ( tempUpX*tempUpY*(1-cosangle)-tempUpZ*sinangle )*directionY;
newDirectionX += ( tempUpX*tempUpZ*(1-cosangle)+tempUpY*sinangle )*directionZ;
newDirectionY = ( tempUpX*tempUpY*(1-cosangle)+tempUpZ*sinangle )*directionX;
newDirectionY += ( cosangle+tempUpY*tempUpY*(1-cosangle) )*directionY;
newDirectionY += ( tempUpY*tempUpZ*(1-cosangle)-tempUpX*sinangle)*directionZ;
newDirectionZ = ( tempUpX*tempUpZ*(1-cosangle)-tempUpY*sinangle )*directionX;
newDirectionZ += ( tempUpY*tempUpZ*(1-cosangle)+tempUpX*sinangle )*directionY;
newDirectionZ += ( cosangle+tempUpZ*tempUpZ*(1-cosangle) )*directionZ;
float len2 = (float)sqrt(newDirectionX*newDirectionX+newDirectionY*newDirectionY+newDirectionZ*newDirectionZ);
//更新视点坐标
eyeX = viewX + newDirectionX/len2*len;
eyeY = viewY + newDirectionY/len2*len;
eyeZ = viewZ + newDirectionZ/len2*len; |
|