首页 > 解决方案 > 如何在场景中自动移动相机?

问题描述

我每个点有 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;
        }
    }
}

标签: c#opengl

解决方案


在 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 方法。


推荐阅读