我有一个3D相机,其当前旋转存储为四元数,我无法正确旋转它.我希望相机根据每帧的鼠标移动(第一人称射击式)逐渐围绕其局部轴旋转,但旋转是错误的.它有点工作,但相机似乎不应该绕其前轴"滚动".
我用这个函数更新每帧的旋转:
void Camera::rotate(const Quat& q)
{
// m_rot is the current rotation
m_rot = m_rot * q;
}
Run Code Online (Sandbox Code Playgroud)
这是我的四元数乘法函数:
Quat Quat::operator*(const Quat &rhs) const
{
// quaternion elements in w,x,y,z order
Vector4d res;
res[0] = m_q[0]*rhs.m_q[0] - m_q[1]*rhs.m_q[1] -
m_q[2]*rhs.m_q[2] - m_q[3]*rhs.m_q[3];
res[1] = m_q[0]*rhs.m_q[1] + m_q[1]*rhs.m_q[0] +
m_q[2]*rhs.m_q[3] - m_q[3]*rhs.m_q[2];
res[2] = m_q[0]*rhs.m_q[2] - m_q[1]*rhs.m_q[3] +
m_q[2]*rhs.m_q[0] + m_q[3]*rhs.m_q[1];
res[3] = m_q[0]*rhs.m_q[3] + m_q[1]*rhs.m_q[2] -
m_q[2]*rhs.m_q[1] + m_q[3]*rhs.m_q[0];
return Quat(res);
}
Run Code Online (Sandbox Code Playgroud)
我做错了什么,或者这是某种浮点错误的事情?
约束3D旋转的正确/最佳方法是什么(使用欧拉角和/或四元数)?
我的做法似乎有些不对劲.我正在将旋转应用于骨架层次结构中的骨骼以进行动画,并且骨骼有时会明显地"跳"到错误的方向,并且各个Euler组件正在环绕其范围的另一端.
我使用欧拉角来表示当前方向,转换为四元数来进行旋转,并独立地夹住每个欧拉角轴.这是C++伪代码,基本上显示了我正在做的事情:
Euler min = ...;
Euler max = ...;
Quat rotation = ...;
Euler eCurrent = ...;
// do rotation
Quat qCurrent = eCurrent.toQuat();
qCurrent = qCurrent * rotation;
eCurrent = qCurrent.toEuler();
// constrain
for (unsigned int i = 0; i < 3; i++)
eCurrent[i] = clamp(eCurrent[i], min[i], max[i]);
Run Code Online (Sandbox Code Playgroud) 我正在使用OpenGL进行渲染,当我将线性值写入默认帧缓冲区(没有任何伽马校正)时,它们在我的监视器上显示为线性.这违背了我认为我对伽马校正的所有知识(如下所述:http://gamedevelopment.tutsplus.com/articles/gamma-correction-and-why-it-matters--gamedev-14466).如果没有伽马校正,我希望我的显示器可以看到中距离颜色非线性变暗.
但这是我实际看到的; 我首先没有伽马校正,然后进行伽马校正:

这是我的片段着色器,没有伽马校正(在全屏四边形上绘制到默认的帧缓冲区).这导致左侧的线性图像:
out vec4 fsOut0;
void main( void )
{
// split the screen into 10 discrete color bands
float yResolution = 768.0;
int intVal = int(gl_FragCoord.y / yResolution * 10.0);
fsOut0.rgb = vec3( float(intVal) / 10.0 );
fsOut0.a = 1.0;
}
Run Code Online (Sandbox Code Playgroud)
这里是添加了伽马校正的着色器(从线性空间到sRGB).这导致右侧的图像比线性更明亮:
out vec4 fsOut0;
void main( void )
{
// split the screen into 10 discrete color bands
float yResolution = 768.0;
int intVal = int(gl_FragCoord.y / yResolution * 10.0);
fsOut0.rgb = …Run Code Online (Sandbox Code Playgroud) 为什么编译GLSL几何着色器会出现此错误?
错误:0:15:'gl_VerticesIn':未声明的标识符
这是着色器:
// makes wireframe triangles.
#version 330
#extension GL_ARB_geometry_shader4 : enable
layout(triangles) in;
layout(line_strip, max_vertices = 4) out;
void main(void)
{
for (int i = 0; i < gl_VerticesIn; i++)
{
gl_Position = gl_in[i].gl_Position;
EmitVertex();
}
gl_Position = gl_in[0].gl_Position;
EmitVertex();
EndPrimitive();
}
Run Code Online (Sandbox Code Playgroud)
对我来说似乎很简单,但我找不到关于"gl_VerticesIn"的更多信息,我认为这应该是内置的.如果我只用"3"替换"gl_VerticesIn",一切正常.
我正在使用GeForce GTX 765M和OpenGL 3.3核心配置文件.我没有使用任何其他GPU的此错误.我的司机是最新的.