gpt4 book ai didi

c++ - 尝试实现相机

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:51:37 26 4
gpt4 key购买 nike

我正在尝试实现一个 Camera 类,这样我就可以像下面这样行走和观察世界:

#ifndef _CAMERA_H_
#define _CAMERA_H_

#include <glm\glm.hpp>

class Camera
{
public:
Camera();
~Camera();

void Update(const glm::vec2& newXY);
//if by = 0.0 it means, it will use the const Class speed to scale it
void MoveForward(const float by = 0.0f);
void MoveBackword(const float by = 0.0f);
void MoveLef(const float by = 0.0f);
void MoveRight(const float by = 0.0f);
void MoveUp(const float by = 0.0f);
void MoveDown(const float by = 0.0f);
void Speed(const float speed = 0.0f);

glm::vec3& GetCurrentPosition();
glm::vec3& GetCurrentDirection();
glm::mat4 GetWorldToView() const;
private:
glm::vec3 position, viewDirection, strafeDir;
glm::vec2 oldYX;

float speed;
const glm::vec3 up;
};

#endif

#include "Camera.h"
#include <glm\gtx\transform.hpp>

Camera::Camera()
:up(0.0f, 1.0f, 0.0), viewDirection(0.0f, 0.0f, -1.0f),
speed(0.1f)
{
}


Camera::~Camera()
{
}


void Camera::Update(const glm::vec2& newXY)
{
glm::vec2 delta = newXY - oldYX;
auto length = glm::length(delta);
if (glm::length(delta) < 50.f)
{
strafeDir = glm::cross(viewDirection, up);
glm::mat4 rotation = glm::rotate(-delta.x * speed, up) *
glm::rotate(-delta.y * speed, strafeDir);

viewDirection = glm::mat3(rotation) * viewDirection;
}

oldYX = newXY;
}

void Camera::Speed(const float speed)
{
this->speed = speed;
}

void Camera::MoveForward(const float by)
{
float s = by == 0.0f ? speed : by;

position += s * viewDirection;
}
void Camera::MoveBackword(const float by)
{
float s = by == 0.0f ? speed : by;

position += -s * viewDirection;
}
void Camera::MoveLef(const float by )
{
float s = by == 0.0f ? speed : by;
position += -s * strafeDir;
}
void Camera::MoveRight(const float by )
{
float s = by == 0.0f ? speed : by;
position += -s * strafeDir;
}
void Camera::MoveUp(const float by )
{
float s = by == 0.0f ? speed : by;
position += s * up;
}
void Camera::MoveDown(const float by )
{
float s = by == 0.0f ? speed : by;
position += -s * up;
}

glm::vec3& Camera::GetCurrentPosition()
{
return position;
}
glm::vec3& Camera::GetCurrentDirection()
{
return viewDirection;
}

glm::mat4 Camera::GetWorldToView() const
{
return glm::lookAt(position, position + viewDirection, up);
}

然后我按如下方式更新和渲染:

void Game::OnUpdate()
{
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


glUniformMatrix4fv(program->GetUniformLocation("modelToViewWorld"), 1, GL_FALSE, &cam.GetWorldToView()[0][0]);

}

void Game::OnRender()
{

model->Draw();

}

顶点着色器的样子:

#version 410

layout (location = 0) in vec3 inVertex;
layout (location = 1) in vec2 inTexture;
layout (location = 2) in vec3 inNormal;

uniform mat4 modelToViewWorld;


void main()
{
gl_Position = vec4(mat3(modelToViewWorld) * inVertex, 1);

}

但我正在移动/旋转模型本身,而不是它周围的相机。我在这里做错了什么?

最佳答案

我认为问题在于您没有反转 View 矩阵。模型- View 矩阵只是模型->世界坐标矩阵变换和世界-> View 坐标矩阵变换的产物。第一个获取局部模型空间中的坐标并将它们转换到世界空间,因此不需要反转。然而,第二个获取世界空间中相机的坐标并将其转换为相机的局部坐标系,由于它与第一个相反,因此需要反转。

关于c++ - 尝试实现相机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27672551/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com