Wildvine Engine
Referencia Doxygen del codigo propio de Wildvine Engine.
Cargando...
Buscando...
Nada coincide
Camera.cpp
Ir a la documentación de este archivo.
1
7
9 XMStoreFloat4x4(&m_view, XMMatrixIdentity());
10 XMStoreFloat4x4(&m_proj, XMMatrixIdentity());
11}
12
13void
14Camera::setLens(float fovYRadians,
15 float aspectRatio,
16 float nearPlane,
17 float farPlane) {
18 m_fovY = fovYRadians;
19 m_aspectRatio = aspectRatio;
20 m_nearPlane = nearPlane;
21 m_farPlane = farPlane;
22
23 XMMATRIX proj = XMMatrixPerspectiveFovLH(m_fovY, m_aspectRatio, m_nearPlane, m_farPlane);
24 XMStoreFloat4x4(&m_proj, proj);
25}
26
27void
28Camera::setPosition(float x, float y, float z) {
29 m_position = EU::Vector3(x, y, z);
30 m_viewDirty = true;
31}
32
33void
35 m_position = pos;
36 m_viewDirty = true;
37}
38
39void
40Camera::lookAt(const EU::Vector3& pos, const EU::Vector3& target, const EU::Vector3& up) {
41 m_position = pos;
42 XMVECTOR P = XMVectorSet(m_position.x, m_position.y, m_position.z, 1.0f);
43 XMVECTOR T = XMVectorSet(target.x, target.y, target.z, 1.0f);
44 XMVECTOR U = XMVectorSet(up.x, up.y, up.z, 0.0f);
45
46 XMVECTOR F = XMVector3Normalize(XMVectorSubtract(T, P));
47 XMVECTOR R = XMVector3Normalize(XMVector3Cross(U, F));
48 XMVECTOR Up = XMVector3Cross(F, R);
49
50 m_forward = FromXM(F);
51 m_right = FromXM(R);
52 m_up = FromXM(Up);
53}
54
55void
56Camera::walk(float d) {
57 XMVECTOR F = XMVectorSet(m_forward.x, m_forward.y, m_forward.z, 0.0f);
58 XMVECTOR P = XMVectorSet(m_position.x, m_position.y, m_position.z, 1.0f);
59 //P = XMVectorAdd(P, XMVectorScale(F, d));
60 P += d * F;
61 m_position = FromXM(P);
62 m_viewDirty = true;
63}
64
65void
67 XMVECTOR R = XMVectorSet(m_right.x, m_right.y, m_right.z, 0.0f);
68 XMVECTOR P = XMVectorSet(m_position.x, m_position.y, m_position.z, 1.0f);
69 //P = XMVectorAdd(P, XMVectorScale(R, d));
70 P += d * R;
71 m_position = FromXM(P);
72 m_viewDirty = true;
73}
74
75void
76Camera::yaw(float radians) {
77 // Rotación alrededor del eje Y global
78 XMMATRIX rot = XMMatrixRotationY(radians);
79
80 XMVECTOR R = XMVectorSet(m_right.x, m_right.y, m_right.z, 0.0f);
81 XMVECTOR U = XMVectorSet(m_up.x, m_up.y, m_up.z, 0.0f);
82 XMVECTOR F = XMVectorSet(m_forward.x, m_forward.y, m_forward.z, 0.0f);
83
84 R = XMVector3TransformNormal(R, rot);
85 U = XMVector3TransformNormal(U, rot);
86 F = XMVector3TransformNormal(F, rot);
87
88 m_right = FromXM(R);
89 m_up = FromXM(U);
90 m_forward = FromXM(F);
91
92 m_viewDirty = true;
93}
94
95void
96Camera::pitch(float radians) {
97 // Rotación alrededor del eje Right local
98 XMVECTOR R = XMVectorSet(m_right.x, m_right.y, m_right.z, 0.0f);
99 XMMATRIX rot = XMMatrixRotationAxis(R, radians);
100
101 XMVECTOR U = XMVectorSet(m_up.x, m_up.y, m_up.z, 0.0f);
102 XMVECTOR F = XMVectorSet(m_forward.x, m_forward.y, m_forward.z, 0.0f);
103
104 U = XMVector3TransformNormal(U, rot);
105 F = XMVector3TransformNormal(F, rot);
106
107 m_up = FromXM(U);
108 m_forward = FromXM(F);
109
110 m_viewDirty = true;
111}
112
113void
115 if (!m_viewDirty) return;
116 XMVECTOR R = XMVectorSet(m_right.x, m_right.y, m_right.z, 0.0f);
117 XMVECTOR U = XMVectorSet(m_up.x, m_up.y, m_up.z, 0.0f);
118 XMVECTOR F = XMVectorSet(m_forward.x, m_forward.y, m_forward.z, 0.0f);
119 XMVECTOR P = XMVectorSet(m_position.x, m_position.y, m_position.z, 1.0f);
120
121 // Re-ortonormalizar (para evitar drift por floats)
122 F = XMVector3Normalize(F);
123 R = XMVector3Normalize(XMVector3Cross(U, F));
124 U = XMVector3Cross(F, R);
125
126 m_forward = FromXM(F);
127 m_right = FromXM(R);
128 m_up = FromXM(U);
129
130 // View (LH) mirando en dirección forward | View = LookToLH(pos, pos + forward, up)
131 XMMATRIX view = XMMatrixLookToLH(P, F, U);
132 XMStoreFloat4x4(&m_view, view);
133 m_viewDirty = false;
134}
135
136
Declara la API de Camera dentro del subsistema Utilities.
Camera()
Definition Camera.cpp:8
bool m_viewDirty
Flag indicating whether the view matrix needs to be recalculated.
Definition Camera.h:177
void pitch(float radians)
Rotación sobre el eje Right local (pitch).
Definition Camera.cpp:96
float m_fovY
The field of view (FOV) angle in radians.
Definition Camera.h:172
float m_farPlane
The distance to the far clipping plane.
Definition Camera.h:175
EU::Vector3 m_forward
The forward vector of the camera's orthonormal basis.
Definition Camera.h:165
XMFLOAT4X4 m_view
Definition Camera.h:168
XMFLOAT4X4 m_proj
Definition Camera.h:169
EU::Vector3 FromXM(FXMVECTOR v)
Definition Camera.h:151
void setPosition(float x, float y, float z)
Define posición en mundo.
Definition Camera.cpp:28
EU::Vector3 m_up
The up vector of the camera's orthonormal basis.
Definition Camera.h:164
void strafe(float d)
Movimiento relativo a la cámara (izquierda/derecha).
Definition Camera.cpp:66
float m_nearPlane
The distance to the near clipping plane.
Definition Camera.h:174
void lookAt(const EU::Vector3 &pos, const EU::Vector3 &target, const EU::Vector3 &up=EU::Vector3(0, 1, 0))
Fuerza la cámara a mirar a un objetivo (LH).
Definition Camera.cpp:40
void updateViewMatrix()
Recalcula la matriz View si es necesario.
Definition Camera.cpp:114
float m_aspectRatio
The aspect ratio of the camera's view (width divided by height).
Definition Camera.h:173
EU::Vector3 m_position
The position of the camera in world space.
Definition Camera.h:160
void yaw(float radians)
Rotación sobre el eje Y global (yaw).
Definition Camera.cpp:76
void walk(float d)
Movimiento relativo a la cámara (adelante/atrás).
Definition Camera.cpp:56
void setLens(float fovYRadians, float aspectRatio, float nearPlane, float farPlane)
Configura la proyección en perspectiva (LH).
Definition Camera.cpp:14
EU::Vector3 m_right
The right vector of the camera's orthonormal basis.
Definition Camera.h:163
A 3D vector class.
Definition Vector3.h:45
float x
The x-coordinate of the vector.
Definition Vector3.h:47
float z
The z-coordinate of the vector.
Definition Vector3.h:49
float y
The y-coordinate of the vector.
Definition Vector3.h:48