一种摄像机锁定的实现方法(原创)

一种摄像机锁定的实现方法(原创)

By 头发抽筋

    摄像机的锁定的功能在3D游戏里面经常用到,摄像机有时候必须跟着某个目标移动,或者以固定轨道的方式来观察摄像机锁定的物体,这会遇到一些问题,下面具体描述了我用球体的参数方程来实现一个摄像机的锁定功能。

摄像机锁定一个目标的时候,往往是根据摄像机和目标的位置,然后计算摄像机的向量来对准目标。这样有个问题,就是想改变摄像机和目标的相对位置时会很麻烦,需要输入摄像机的新坐标,如果只想使摄像机相对目标围绕纵轴旋转90°,你会发现这样做会很麻烦,下面只是介绍一下实现的思路,

被锁定的物体你可以想象成是球体的中心点,然后摄像机在球体上运动,并且一直在对准球体的中心,这样,根据球体的参数方程:

x=r * sin(α) * cos(β)
y=r * sin(α) * sin(β)
z=r * cos(α)

(这里z轴是纵轴, y轴指向右方, x轴指向垂直于纸面的方向)r是球的半径,α角是半径与Z轴正向的夹角,β角是半径在xy平面的投影与x轴正向的夹角,他们的取值范围是 0≤ r   0≤ α  π 0  β  

你只要为你摄像机锁定的函数提供3个参数:距离(球体半径)r,两个夹角参数αβ,就可以方便的控制摄像机移动到几乎相对于被锁定物体的任意位置,下面提供OpenGL实现的部分代码。

void  Camera::lockOn (GLfloat alpha, GLfloat beta, GLfloat dst) 
// x, y, z 是摄像机的位置,alpha,beta就是公式中的α,β
// dst 是公式中的半径r
{
        
// 放置beta和alpha为90的倍数
     if ( int ((beta  /   90 ))  %   2   !=   0 )
        beta 
++ ;
    
if ( int ((alpha  /   90 ))  %   2   !=   0 )
        alpha 
++ ;

       
// 这里值得注意,OpenGL的坐标系是x轴向右,y轴向上,z轴向前
       
// 在赋值的时候需要交换公式中的坐标轴,需要做的变换如下:
       
// Zogl  =  X公式  
       
// Xogl  =  Y公式   
       
// Yogl  =  Z公式  
       
// degrees2radians() 函数是我自己定义的角度转弧度,C库函数sin() 和cos()的参数 
       
// 是弧度
    x  =      dst  *  sin (degrees2radians (alpha))  *  sin (degrees2radians (beta)) ;
    y 
=     dst  *  cos (degrees2radians (alpha));
    z 
=     dst  *  sin (degrees2radians (alpha))  *  cos (degrees2radians (beta)) ;
}

void Camera::lockOn (GLfloat alpha, GLfloat beta, GLfloat dst) 
//x, y, z 是摄像机的位置,alpha,beta就是公式中的α,β
//dst 是公式中的半径r
{
    
//放置beta和alpha为90的倍数
if(int((beta / 90)) % 2 != 0)
beta 
++;
if(int((alpha / 90)) % 2 != 0)
alpha 
++;
//这里值得注意,OpenGL的坐标系是x轴向右,y轴向上,z轴向前
//在赋值的时候需要交换公式中的坐标轴,需要做的变换如下:
//Zogl  =  X公式  
//Xogl  =  Y公式   
//Yogl  =  Z公式  
//degrees2radians() 函数是我自己定义的角度转弧度,C库函数sin() 和cos()的参数 
//是弧度
= dst * sin (degrees2radians (alpha)) * sin (degrees2radians (beta)) ;
=    dst * cos (degrees2radians (alpha));
=    dst * sin (degrees2radians (alpha)) * cos (degrees2radians (beta)) ;

用此方法稍加改动还可以绘制线框球体。

转载于:https://www.cnblogs.com/goku_1/archive/2008/09/10/1288274.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值