如何在场景中自动移动相机?

时间:2019-05-14 18:34:43

标签: c# opengl

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

1 个答案:

答案 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方法。