gpt4 book ai didi

c++ - 在轨道相机上实现缩放

转载 作者:太空宇宙 更新时间:2023-11-04 12:21:45 25 4
gpt4 key购买 nike

我想放大轨道相机的目标。

使用如下函数操作相机:

moveCamera(x,y,z);

根据角度,值 x、y、z 应该不同才能获得正确的缩放功能,但我想不出一种方法来做到这一点。

我使用 getCameraposxgetTargetposy 等函数来获取我的目标和相机的坐标。

在 PigBens 的帮助下,Zoom 现在可以正常工作了,但我遇到了一个问题。放大没问题,但放大太近后缩小会停止工作。太近了我仍然很远。

这是我的缩放功能。

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;
}

最佳答案

从相机位置减去目标位置,然后缩放它,然后再次添加目标位置。

camera_position -= target_position;
camera_position /= zoom_factor;
camera_position += target_position;

关于你的第二个问题。我的猜测是这是由于 float 不够精确。当您下降到某个点时,乘以 1.02 不足以将 float 的值更改为下一个更高的可表示值,因此它根本不会改变。我的测试表明,只有 float 在 10e-44 范围内才会发生这种情况,因此您必须使用一些非常巨大的单位才能成为问题。一些可能的解决方案。

  1. 使用 double 而不是 float 。你仍然会遇到同样的问题。但在更近距离的缩放之前,它不会发挥作用。

  2. 使用较小的单位。我通常只选择 1.0 = 1 米,我从来没有遇到过这个问题。

  3. 实现最大缩放。实际上,您可以结合上面的其他 2 项来执行此操作。

关于c++ - 在轨道相机上实现缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4587049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com