游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2038|回复: 4

怎样实现第三人称视角 谢谢!

[复制链接]

17

主题

85

帖子

85

积分

注册会员

Rank: 2

积分
85
发表于 2006-4-7 18:15:00 | 显示全部楼层 |阅读模式
感觉主要是改变视角坐标系的各个参数
比如观察点不变,改变摄象机的位置(让该位置绕观察点作圆周运动)
不知道这样对不对?(自己试着实现了一下,不行,也可能实现的有问题)

再问一下:有了向量等,为什么很多地方还用到“四元数”?

0

主题

237

帖子

237

积分

中级会员

Rank: 3Rank: 3

积分
237
发表于 2006-4-8 02:11:00 | 显示全部楼层

Re:怎样实现第三人称视角 谢谢!

就是用 lookat() 函?底龅? 不行的?, 我想主要LZ改?camera位置方法???.

"四元??quot;主要是避免出? Gimbal Lock???.

17

主题

85

帖子

85

积分

注册会员

Rank: 2

积分
85
 楼主| 发表于 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;

0

主题

237

帖子

237

积分

中级会员

Rank: 3Rank: 3

积分
237
发表于 2006-4-9 17:26:00 | 显示全部楼层

Re:怎样实现第三人称视角 谢谢!

不太明白LZ 的源?, 你要"观察方向的反方向", 但?]有normalize的"direction".

我的做法比??渭?, camera要向左移?? 就是:
cam->vEye.x=(-cam->vRight.x*moveDist);
cam->vEye.z=(-cam->vRight.z*moveDist);
右移就是:
cam->vEye.x=(cam->vRight.x*moveDist);
cam->vEye.z=(cam->vRight.z*moveDist);

cam->vRight就是camera的右向量. ??邮且宰⒁?之物体(vView)为中心旋转.

0

主题

25

帖子

29

积分

注册会员

Rank: 2

积分
29
发表于 2006-4-9 22:59:00 | 显示全部楼层

Re:怎样实现第三人称视角 谢谢!

PS:
      四元数是3D编程表示旋转的另一种数学形式,用四元数代替旋转矩阵的好处是,四元数使用更少的存储空间,四元数之间的连接运算需要的算术运算跟少,在产生平滑的3D动画时,四元数更容易进行修改~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-24 04:08

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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