查看: 2696|回复: 2

setTransformation设置UP不起作用

[复制链接]

该用户从未签到

发表于 2014-2-11 05:04:29 | 显示全部楼层 |阅读模式
我创建了一个XY方向的平面,并继承NodeTrackerManipulator写了个操作器观察他。
需要实现切换从平面的侧上方俯视观察这个平面的正面和背面,也就是当center为(x, y, 0)时设置eye在(x+120, y, z)和(x+120, y, -z)
现在发现无法正确设置up方向。尝试取当前up方向,把up.z()取负
  1. this->getTransformation(eye,center,up);
  2. eye = osg::Vec3d(eye.x(),eye.y(),-eye.z());
  3. up = osg::Vec3d(up.x(),up.y(),-up.z());
  4. this->setTransformation(eye,center,up);
复制代码

但是切换到观察背面时(eye.z()为负时)是一种仰视视角,如图
upp.png down.png
尝试手动计算up方向,用center到eye的向量叉乘平行于Y轴向量计算up方向
pic.png
  1. this->getTransformation(eye,center,up);
  2. eye = osg::Vec3d(eye.x(),eye.y(),-eye.z());
  3. osg::Vec3d l = eye-center;
  4. l.normalize();
  5. up = osg::Vec3d(0.0,-1.0,0.0)^l;
  6. this->setTransformation(eye,center,up);
复制代码

但是切换到背面时仍然是仰视的,请问应如何设置up方向?

添加断点:
正视时eye 520.0 390.0 20.0   center 400.0 390.0 0.0   up -0.16439898730535726 0.00000000000000000 0.98639392383214364
背视时eye 520.0 390.0 -20.0  center 400.0 390.0 0.0   up  0.16439898730535726 0.00000000000000000 0.98639392383214364
很奇怪up只有x为改变了符号,应该z也改变符号才对啊?

该用户从未签到

发表于 2014-2-11 10:40:49 | 显示全部楼层
已知look at和一个大概的up方向(例如大概朝向z+)的情况下,可以首先用这两个向量叉积计算side vector;然后通过look at和side叉积计算真正的up

该用户从未签到

 楼主| 发表于 2014-2-12 00:22:16 | 显示全部楼层
本帖最后由 shypzms 于 2014-2-12 00:23 编辑

试了一下,用setByMatrix就可以,
  1. this->getTransformation(eye,center,up);
  2. eye = osg::Vec3d(eye.x(),eye.y(),-eye.z());
  3. up = osg::Vec3d(up.x(),-up.y(),-up.z());
  4. mat.makeLookAt(eye,center,up);
  5. this->setByMatrix(mat);
复制代码

用setTransformation就不行
  1. this->getTransformation(eye,center,up);
  2. eye = osg::Vec3d(eye.x(),eye.y(),-eye.z());
  3. up = osg::Vec3d(up.x(),-up.y(),-up.z());
  4. this->setTransformation(eye,center,up);
复制代码

感觉很奇怪。
不过看了阿锐的解释大概明白为什么有时候up就是设成XYZ轴了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表