0

我正在尝试osg::Camera为另一个视口的相机配置轴指示器的行为(在大多数 CAD 应用程序中,在每个 3D 视口中都有一个代表每个世界空间轴的小模型)。

我通过拉动视口相机的视图矩阵来做到这一点:

// fCam is the 'owning' viewport's camera i.e. the followed camera.
Matrixd newMatrix = fCam->getViewMatrix();

然后我反转它,得到相机的变换矩阵,得到相机的逆视图向量:

newMatrix.invert( newMatrix );

Vec3d eye, focus, up;
newMatrix.getLookAt( eye, focus, up );

eye = focus - eye;
eye.normalize();

我使用视图向量将相机定位在距原点(轴模型所在的位置)固定距离处,然后再次反转矩阵以获得生成的相机视图矩阵:

newMatrix.setTrans( eye * 4.0f );
newMatrix.invert( newMatrix );

viewCam->setViewMatrix( newMatrix );

这应该具有将轴指示器相机设置为遵循“拥有”视口的相机方向的效果,但使其与原点保持固定距离,并且原点始终位于视口的死点。

但它不起作用。方向看起来正确,但位置似乎没有改变,导致轴模型移出屏幕。我为此使用 OpenSceneGraph,并且没有附加到View. 所以我不明白为什么相机没有像我预期的那样移动 - 有什么建议吗?

4

2 回答 2

0

我通过使用内置*LookAt(..)的获取设置方法“解决”了这个问题:

Vec3d eye, focus, up;
fCam->getViewMatrixAsLookAt( eye, focus, up );

eye = eye - focus;
eye.normalize();
viewCam->setViewMatrixAsLookAt( eye * 4.0, Vec3d(), up );

我看不出我的“手动”代码和这些便捷方法之间有什么区别。我认为 OSG 可能稍后会在渲染管道中执行一些额外的转换,但我在它的源代码中找不到任何东西。

于 2013-11-17T10:45:10.377 回答
-1

更新

我误解了数学要求,但在查看您的解决方案后发现了问题。

newMatrix.getLookAt( eye, focus, up );

getLookAteye, focus方法在返回和之前取给定矩阵本身的逆up。由于您提供的是倒置矩阵,因此您的原始代码失败了,所以应该是这样的:

Matrixd newMatrix = fCam->getViewMatrix();

Vec3d eye, focus, up;
newMatrix.getLookAt( eye, focus, up );

eye = eye - focus;
eye.normalize();

newMatrix.invert( newMatrix );
newMatrix.setTrans( eye * 4.0f );
newMatrix.invert( newMatrix );

viewCam->setViewMatrix( newMatrix );

我认为问题出在:

newMatrix.setTrans( eye * 4.0f );

此方法相对于原点 (0, 0, 0) 设置位置。你应该使用类似的东西:

osg::Vec3 direction = focus - eye;
direction.normalize();

newMatrix.setTrans( eye + direction * 4.0f );
于 2013-11-16T21:01:16.053 回答