как я могу автоматически перемещать камеру по сцене? - PullRequest
0 голосов
/ 14 мая 2019

У меня есть 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 голосов
/ 15 мая 2019

В 2D, чтобы перейти от 1 точки к другой, вы просто определяете 2D вектор (x, y) и шаг за шагом увеличиваете обе координаты на величину, пока не достигнете места назначения.В 3D то же самое, но добавлена ​​координата Z.

То, что вы ищете, - это линейная интерполяция между двумя трехмерными векторами.

Я бы посоветовал вам создать класс интерполятора, который берет 2 3d точки и интерполирует их по определенному времени дельты.

Используя это, вы можете получить точку, перемещающуюся из точки A в B, и расположить камеру в этом положении (я предполагаю, что целевой вектор не перемещается).

Для линейной интерполяции междуэти точки, просто добавьте A с B, умноженным на delta (быть delta от 0.0 до 1.0, означающим 0 - начало, а 1.0 - конец).

После интерполяции просто поместите вектор ГЛАЗ камеры на интерполированную точку.После достижения 1,0 на переходе.Измените пункт назначения и источник на следующую точку.(первая интерполяция A-> B, вторая B-> C и т. д., переход от дельты 0,0 к 1,0).

Если вам нужна дополнительная помощь, просто спросите.

PD: кажется, что вам также нужны методы SetPosition / SetTarget для камеры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...