【问题标题】:Understanding OBJ loading via ASSIMP通过 ASSIMP 了解 OBJ 加载
【发布时间】:2018-05-10 05:26:13
【问题描述】:

我通过编译自己的二进制文件来使用 ASSIMP 4.0.1。我一直在错误地加载法线。我已将我的 cube.obj 缩减为一个三角形......我想确认它做错了并且我没有发疯。最后我该如何解决它也是一个问题。 OBJ 文件如下所示:

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

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

我正在绘制的是三角形的法线,这清楚地表明它是 (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 是黑色?我正在使用以下顶点和片段着色器:

#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;
}

--

#version 430
in vec4 normal;
in vec2 uv0;

out vec4 outFragColor;

uniform sampler2D TEXTURE_0;

uniform vec3 DirectionalLightDirection;
uniform vec4 DiffuseReflectance;
uniform float Shininess;

//Blinn-Phong lighting ... TODO make this a macro

float calculateDiffuseTerm(vec3 N, vec3 L)
{
    return clamp(dot(N, L), 0.0, 1.0);
}

float calculateSpecularTermWithHalfVector(vec3 N, vec3 L, vec3 V)
{
    float term = 0.0;
    if(dot(N, L) > 0.0)
    {
        vec3 H = normalize(L+V);
        term = pow(dot(N, H), Shininess);
    }
    return term;
}

void main()
{
    //Calculate diffuse
    vec4 textureColor = texture(TEXTURE_0, uv0);

    vec3 directionalLight = -1.0 * DirectionalLightDirection;
    float diffuseTerm = calculateDiffuseTerm(normalize(normal.xyz), directionalLight);

    outFragColor = normalize(normal);// diffuseTerm * DiffuseReflectance;
}

【问题讨论】:

    标签: c++ opengl glsl assimp wavefront


    【解决方案1】:

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

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

    Wavefront OBJ 使用约定

    vertex/texcoord/normal 
    

    而不是您所期望的vertex/normal/texcoord

    【讨论】:

    • 正确,我刚刚删除了我的帖子,因为我对面部使用的地址架构有误。忘记我几年前实施的吧:-)。
    • 你说的是正确的,但 ASSIMP 似乎在不应该的时候组合了顶点。所以去掉remove duplicate vertex flag后,现在就好了。
    猜你喜欢
    • 1970-01-01
    • 2014-06-10
    • 2018-05-26
    • 1970-01-01
    • 2014-08-27
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 2014-09-10
    相关资源
    最近更新 更多