c# - 如何在场景中自动移动相机?
问题描述
我每个点有 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;
}
}
}
解决方案
在 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 等等,从 delta 0.0 到 1.0)。
如果您需要更多帮助,请询问。
PD:似乎您也需要相机的 SetPosition/SetTarget 方法。
推荐阅读
- laravel - 无法通过 axios 发送 HTML 字符串
- javascript - 无法获取 document.getElementById。控制台说无法读取属性“null 值”
- git - GitHub Desktop 突然无法获取源,无法推送更改
- css - 用于匹配元素的 CSS 规则不跟随特定类的另一个元素
- apache-spark - ClassNotFoundException 同时通过 SIGPWR 退役执行器的 rdd 块(优雅退役)
- julia - 如何在 Julia 中打印/知道变量的内存位置?
- mysql - (Docker) Laravel 和 Artisan 命令 .env DB_HOST 冲突
- amazon-web-services - Cloudformation:切割配置文件的最佳实践是什么?
- r - R循环用于显示多个数据帧中最丰富的行
- api - 如何从按键获取执行的命令