我希望放大轨道相机的目标。
使用以下功能操作相机:
moveCamera(x,y,z);
根据角度,值x,y,z应该不同,以获得正确的缩放功能,但我无法找到一种方法。
我使用getCameraposx
,getTargetposy
等函数来获取目标和相机的坐标。
在PigBens帮助之后,Zoom kinda现在可以正常工作,但我遇到了问题。放大是没有问题的,但是在放大太近后,缩小停止工作。而且距离太近我仍然很远。
这是我的缩放功能。
void Camera::orbZoom(bool Zoo)
{
float x;
float y;
float z;
float xc;
float yc;
float zc;
float zoom;
x=getTargetposx();
y=getTargetposy();
z=getTargetposz();
xc=getCameraposx();
yc=getCameraposy();
zc=getCameraposz();
xc=xc-x;
yc=yc-y;
zc=zc-z;
if ( ivan==true){
zoom = 1.02;
if (xc<1){xc=+1.5;}
else if (yc<1){yc=+1.5;}
else if (zc<1){zc=+1.5;}
xc=xc*zoom;
yc=yc*zoom;
zc=zc*zoom;
}
if(ivan==false) {
zoom = 0.98;
xc=xc*zoom;
yc=yc*zoom;
zc=zc*zoom;
}
xc=xc+x;
yc=yc+y;
zc=zc+z;
camerapos.assign(xc,yc,zc);
}
好的,所以最后一件事并没有像我在上一篇评论中写的那样。我认为还有其他原因导致这种行为。停止工作的时间限制比相机起始位置或起始位置更接近目标,对此不太确定。但是如果我从缩小开始并且没有比摄像机起始位置更接近它的工作。
我认为错误是在代码的这一部分,但我可能是错的,所以如果有人想看到其他部分只是问。我所有其他相机行为都正常工作。两种模式,轨道和翻滚。俯仰,偏航和滚动适用于两种模式和扫描模式。
以下是其中两个功能。
void Camera::strafeUp(float distance)
{
camerapos += upvect * distance;
targetpos += upvect * distance;
}
void Camera::tumbleYaw(float angle)
{
Quaternionf rotation((angle*PIdiv180), upvect);
rightvect = rotation.matrix() * rightvect;
forwardvect = rotation.matrix() * forwardvect;
forwardvect.normalize();
rightvect.normalize();
targetpos = camerapos + forwardvect * cameralength;
}
答案 0 :(得分:1)
从相机位置减去目标位置,然后缩放,然后再次添加目标位置。
camera_position -= target_position;
camera_position /= zoom_factor;
camera_position += target_position;
关于你的第二个问题。我的猜测是,这是因为花车缺乏精确度。当你到达某个点时,乘以1.02不足以将浮点值更改为下一个更高的可表示值,因此它根本不会改变。我的测试表明,直到浮点数处于10e-44
范围内才会发生这种情况,所以你必须使用一些非常巨大的单位来解决这个问题。一些可能的解决方案。
使用双打而不是浮点数。你仍然会遇到同样的问题。但是,在更接近缩放之前它不会发挥作用。
使用较小的单位。我通常只跟1.0 = 1 meter
一起去,我从来没有遇到过这个问题。
执行最大缩放。你实际上会与上面的其他2个结合使用。