小编KTC*_*KTC的帖子

四元数相机.如何使其正确旋转?

我有一个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)

我做错了什么,或者这是某种浮点错误的事情?

c++ math 3d rotation

8
推荐指数
1
解决办法
3983
查看次数

如何约束3D旋转(欧拉)

约束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)

c++ 3d animation

5
推荐指数
1
解决办法
1706
查看次数

OpenGL:Gamma校正图像看起来不是线性的

我正在使用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)

c++ opengl gamma glsl srgb

5
推荐指数
1
解决办法
655
查看次数

'gl_VerticesIn':未声明的标识符

为什么编译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的此错误.我的司机是最新的.

opengl glsl geometry-shader

2
推荐指数
1
解决办法
1149
查看次数

标签 统计

c++ ×3

3d ×2

glsl ×2

opengl ×2

animation ×1

gamma ×1

geometry-shader ×1

math ×1

rotation ×1

srgb ×1