我要发帖 回复

中级会员

5

主题

287

积分

0

专家分

:

私信
发表时间 : 2013-12-2 16:55:39 | 浏览 : 1582    评论 : 8
5积分
本帖最后由 d_jun339 于 2013-12-3 08:28 AM 编辑

vpObject*  pObject_lander = new vpObject();  //物体A      
vpObserver*  pObserver_myObserver = new vpObserver();  //观察者B
vpTransform* pTransform_myTransform = new vpTransform();  //转换
pTransform_myTransform->setTranslate( 0 ,  -30 ,  5);   //设置转换位置

pObserver_myObserver->setLookFrom( pTransform_myTransform );
pObject_lander->addChild( pTransform_myTransform );  //将转换设置为物体A的孩子
视点在A物体后,并会伴随A物体运动。我想通过转换实现对A物体的环绕观察,并能推进和拉远观察者。
如图附件中虚线部分所示,Z轴不变。
关于环绕我的做法是:
case vpWindow::KEY_RIGHT:
  {
   dR=30;  //半径,即观察者距离物体A的距离
      x=dR*cos(dQ*3.14159/180); //dQ为每次RotateH的度数1.0
     y= dR*sin(dQ*3.14159/180);//x,y为计算出来转1度观察者的位置
    pTransform_myTransform->setTranslateX(x,false);
pTransform_myTransform->setTranslateY(y,false); pTransform_myTransform->setRotateH(1.0,true);
   dQ=dQ+1.0;
  }
这样总是无法实现,新鸟跪求正确的做法!
11.jpg

最佳答案

查看完整内容

x=dR*cos(dQ*3.14159/180); //dQ为每次RotateH的度数1.0 y= dR*sin(dQ*3.14159/180);//x,y为计算出来转1度观察者的位置 pTransform_myTransform->setTranslateX(x,false); pTransform_myTransform->setTranslateY(y,false); pTransform_myTransform->setRotateH(1.0,true); dQ=dQ+1.0; 修改为: x=dR*cos((dQ+90.0)*3.14159/180); //dQ为每次RotateH的度数1.0 y= dR*sin((dQ+90.0)*3.14159/180) ...

最近VR访客

xiao_rong 评论于2013-12-2 16:55:40
      x=dR*cos(dQ*3.14159/180); //dQ为每次RotateH的度数1.0
      y= dR*sin(dQ*3.14159/180);//x,y为计算出来转1度观察者的位置
     pTransform_myTransform->setTranslateX(x,false);
pTransform_myTransform->setTranslateY(y,false); pTransform_myTransform->setRotateH(1.0,true);
    dQ=dQ+1.0;
修改为:
      x=dR*cos((dQ+90.0)*3.14159/180); //dQ为每次RotateH的度数1.0
      y= dR*sin((dQ+90.0)*3.14159/180);//x,y为计算出来转1度观察者的位置
     pTransform_myTransform->setTranslateX(x,false);
pTransform_myTransform->setTranslateY(y,false); pTransform_myTransform->setRotateH(1.0,true);
    dQ=dQ+1.0;

因为H的定义是0点在Y轴、逆时针为正,你在做三角转换时是假定0点在X轴,所以要加上90°
xiao_rong 评论于2013-12-2 18:20:26
x=dQ*cos(dQ*3.14159/180); //dQ为每次RotateH的度数1.0
应该是:
x=dR*cos(dQ*3.14159/180); //dQ为每次RotateH的度数1.0
xiao_rong 评论于2013-12-2 18:24:27
pTransform_myTransform->setRotateH(1.0,true); 可以不要
因为已经用xy坐标进行了定位。
xiao_rong 评论于2013-12-2 18:31:18
要弄清楚H在vp中的定义,0°的位置、正方向以及与xy的三角转换关系。
d_jun339 评论于2013-12-2 22:33:36
本帖最后由 d_jun339 于 2013-12-3 08:29 AM 编辑
xiao_rong 发表于 2013-12-2 06:20 PM
x=dQ*cos(dQ*3.14159/180); //dQ为每次RotateH的度数1.0
应该是:
x=dR*cos(dQ*3.14159/180); //dQ为每次R ...


是的 这个是我手误 写错了,还是无法实现,继续求解

pTransform_myTransform->setRotateH(1.0,true);   这句还是要得吧 ,否则setTranslate一定角度后观察者不会朝向 物体A吧。
xiao_rong 评论于2013-12-3 12:41:52
请透彻理解Transform、HPR
设置观察者的HPR为000
d_jun339 评论于2013-12-4 10:23:34
xiao_rong 发表于 2013-12-3 12:50 PM
x=dR*cos(dQ*3.14159/180); //dQ为每次RotateH的度数1.0
      y= dR*sin(dQ*3.14159/180);//x,y为计 ...

因为观察者在Y轴的负方向上,测试dQ-90 或者dQ+270 结果是正确的。谢谢教导。
d_jun339 评论于2013-12-4 10:29:57
另外观察者推进与拉远代码为:
case vpWindow::KEY_UP
{
        dx=30*cos(dQ*3.14159/180);  //dz,dy,dz为全局变量
        dy=30*sin(dQ*3.14159/180);
        dz=5.0;
        if(dZoom>0.2)    //dZoom为缩放比例 初始值为1
        {
            dZoom=dZoom-0.01
            x=dx*dZoom;
            y=dy*dZoom;
            z=dz*dZoom;
           pTransform_myTransform->setTranslate(x,y,z);
        }

}

手机版|VR开发网 统计 津ICP备18009691号
网安备12019202000257

GMT+8, 2021-9-18 05:41 AM

返回顶部