通过ASSIMP了解OBJ加载

时间:2017-11-27 02:11:34

标签: c++ opengl glsl assimp wavefront

我通过编译自己的二进制文件来使用ASSIMP 4.0.1。我不断错误地加载法线。我已经将我的cube.obj减少到只有一个三角形...我想确认它做错了,我不是疯了。最后,我如何解决它也是一个问题。这是OBJ文件的样子:

struct failure { };

template <class F, size_t... Is, typename... Tags>
void match(F f, size_t i, std::index_sequence<Is...>, Tags... tags) {
    auto inner = [&](auto tag) { f(tag); return true; };
    bool matched = ((i == Is && inner(tags)) || ...);
    if (!matched) {
        f(failure{});
    }
}

template <typename... Ts>
void foo(int index) {
    match<Ts...>(overload(
        [](auto tag){
            std::cout << typeid(typename decltype(tag)::type).name() << std::endl;
        },
        [](failure ) { /* ... */ }
    ), index);
}

现在给出了最后一行,我正在加载一个带有属性的三角形:

Loaded Sample

我正在绘制的是三角形的法线,这清楚地表明它是(0.0,1.0,0.0),因为它是RGB,绿色是颜色。使用偏移(平移)创建三角形,该偏移距离x轴的原点为-30.0f,并且直接阴影,并且从顶点着色器传递到片段着色器。此时,我怀疑这个obj文件不正确?注意最后一个法线,(数字3),为什么(0.0,0.0,-1.0)?这不应该是(0.0,0.0,1.0)(从屏幕向外指)?最后为什么这个绿色而不是红色从顶点1和绿色到顶点2和黑色在顶点3?我正在使用以下顶点和片段着色器:

mtllib cube.mtl
g cube Mesh
usemtl cube Mesh_cube

v -0.500000 -0.500000 0.500000
v 0.500000 -0.500000 0.500000
v -0.500000 0.500000 0.500000
v 0.500000 0.500000 0.500000
v -0.500000 0.500000 -0.500000
v 0.500000 0.500000 -0.500000
v -0.500000 -0.500000 -0.500000
v 0.500000 -0.500000 -0.500000
vn 0.000000 0.000000 1.000000
vn 0.000000 1.000000 0.000000
vn 0.000000 0.000000 -1.000000
vn 0.000000 -1.000000 0.000000
vn 1.000000 0.000000 0.000000
vn -1.000000 0.000000 0.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 1.000000 1.000000
f 1/1/1 2/2/1 3/3/1

-

#version 430
in vec3 POSITION;
in vec4 NORMAL;
in vec2 TEXCOORD0;

out vec4 normal;
out vec2 uv0;

uniform mat4 ModelMatrix;
uniform mat4 ViewProjectionMatrix;
uniform mat4 NormalMatrix;
uniform vec3 CameraPosition;

void main()
{
    //normal = normalize(ModelMatrix * NORMAL);
    normal = normalize(NORMAL);
    uv0 = TEXCOORD0;

    vec4 worldPosition = ModelMatrix * vec4(POSITION, 1.0);
    //toCamera = normalize(CameraPosition - worldPosition.xyz);

    gl_Position = ViewProjectionMatrix * worldPosition;
}

1 个答案:

答案 0 :(得分:3)

  

此时,我怀疑这个obj文件不正确?注意最后一个法线,(数字3),为什么(0.0,0.0,-1.0)?

为什么这么说?你的OBJ文件定义了一个三角形,其中所有3个顶点共享正常1(在OBJ中基于一个索引),显然是(0,0,1),也是assimp加载的。

Wavefront OBJ使用惯例

vertex/texcoord/normal 

而不是vertex/normal/texcoord正如您所期待的那样。