我每个都有5个点(x,y,z),我想将相机从第一个点自动移到第二个点,依此类推,但是我无法想象在三个方向上同时移动的方法时间。有人可以帮我吗?
注意:例如,我是自动按下“ s”按钮,它将在各点之间移动
这是到目前为止我的相机类代码:
using GlmNet;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Graphics
{
class Camera
{
float mAngleX = 0;
float mAngleY = 0;
vec3 mDirection;
public vec3 mPosition;
vec3 mRight;
vec3 mUp;
mat4 mViewMatrix;
mat4 mProjectionMatrix;
public Camera()
{
Reset(0, 0, 1.5f, 0, 0, 0, 0, 1, 0);
SetProjectionMatrix(45, 4 / 3, 0.1f, 100);
}
public vec3 GetCameraPosition()
{
return mDirection;
}
public mat4 GetViewMatrix()
{
return mViewMatrix;
}
public mat4 GetProjectionMatrix()
{
return mProjectionMatrix;
}
public void Reset(float eyeX, float eyeY, float eyeZ, float centerX, float centerY, float centerZ, float upX, float upY, float upZ)
{
vec3 eyePos = new vec3(eyeX, eyeY, eyeZ);
vec3 centerPos = new vec3(centerX, centerY, centerZ);
vec3 upVec = new vec3(upX, upY, upZ);
mPosition = eyePos;
mDirection = centerPos - mPosition;
mRight = glm.cross(mDirection, upVec);
mUp = upVec;
mUp = glm.normalize(mUp);
mRight = glm.normalize(mRight);
mDirection = glm.normalize(mDirection);
mViewMatrix = glm.lookAt(mPosition, centerPos, mUp);
}
public void UpdateViewMatrix()
{
mDirection = new vec3((float)(-Math.Cos(mAngleY) * Math.Sin(mAngleX))
, (float)(Math.Sin(mAngleY))
, (float)(-Math.Cos(mAngleY) * Math.Cos(mAngleX)));
mRight = glm.cross(mDirection, new vec3(0, 1, 0));
mUp = glm.cross(mRight, mDirection);
vec3 center = mPosition + mDirection;
mViewMatrix = glm.lookAt(mPosition, center, mUp);
}
public void SetProjectionMatrix(float FOV, float aspectRatio, float near, float far)
{
mProjectionMatrix = glm.perspective(FOV, aspectRatio, near, far);
}
public void Yaw(float angleDegrees)
{
mAngleX += angleDegrees;
}
public void Pitch(float angleDegrees)
{
mAngleY += angleDegrees;
}
public void Walk(float dist)
{
mPosition += dist * mDirection;
}
public void Strafe(float dist)
{
mPosition += dist * mRight;
}
public void Fly(float dist)
{
mPosition += dist * mUp;
}
}
}
答案 0 :(得分:0)
在2D中,要从1点移动到另一个点,只需定义2D向量(x,y),然后将两个坐标逐步增加一个量,直到到达目的地。在3D中是非常相同的,但是添加了Z坐标。
您要寻找的是2个3d向量之间的线性插值。
我建议您创建一个插值器类,该插值器类将2个3d点插入并按定义的增量时间插值。
使用它,您可以使一个点从点A移到点B,并将相机定位在该位置(我假设目标矢量不会移动)。
要在这些点之间进行线性插值,只需将A乘以B乘以delta(从0.0到1.0的delta表示0是开始,而1.0是结束)。
插值后,只需将摄像机的EYE向量定位在插值点上。在达到1.0后过渡。将目的地和起点更改为下一个点。 (第一个插值A-> B,第二个B-> C等,从增量0.0到1.0)。
如果您需要更多帮助,请询问。
PD:似乎您也需要相机的SetPosition / SetTarget方法。