0

私が見つけた唯一のJSONエクスポーター(http://code.google.com/p/blender-machete/)は2.6で動作しないため、Blender2.6x用の単純なJSONエクスポーターを作成しようとしています。Blenderから頂点、法線、インデックスを取得するのに問題はありませんでしたが、試してみると、テクスチャ座標が間違っている理由がわからないようです。テクスチャは、単純な立方体の面を斜めに横切って傾いていて、伸びているように見えます...本当に醜くて間違っています。私はオンラインでいくつかの公式輸出業者の情報源を調べてきましたが、それでも理解できないので、誰かが私にいくつかのヒントや解決策を教えてくれることを望んでいました。

テクスチャ座標にアクセスするために使用しているコードは次のとおりです。

    # add texture coordinates to scene_data structure
    m = bpy.context.active_object.to_mesh(bpy.context.scene, True, 'PREVIEW')
    for j in range(len(m.tessfaces)):
        if len(m.tessface_uv_textures) > 0:
            scene_data[mesh_number]["tex_coords"].append( m.tessface_uv_textures.active.data[j].uv1.x )
            scene_data[mesh_number]["tex_coords"].append( m.tessface_uv_textures.active.data[j].uv1.y )
            scene_data[mesh_number]["tex_coords"].append( m.tessface_uv_textures.active.data[j].uv2.x )
            scene_data[mesh_number]["tex_coords"].append( m.tessface_uv_textures.active.data[j].uv2.y )
            scene_data[mesh_number]["tex_coords"].append( m.tessface_uv_textures.active.data[j].uv3.x )
            scene_data[mesh_number]["tex_coords"].append( m.tessface_uv_textures.active.data[j].uv3.y )

これでテクスチャ座標のリストが表示されますが、上で説明したようにテクスチャの外観が正しくないため、どういうわけか間違っています。

他に何をすべきかわかりませんが、コードを表示します。考えられるあらゆる方法でコードを変更しようとしたため、上記のコードスニペットが次のような関数になります。

def get_json(objects, scene):
    """ Currently only supports one scene. 
        Exports with -Z forward, Y up. """

    scene_data = []
    mesh_number = -1

    # iterate over each mesh
    for i in range(len(bpy.data.objects)):
        if bpy.data.objects[i].type == 'MESH':

            mesh_number += 1

            bpy.ops.object.mode_set(mode='OBJECT')

            # convert all the mesh's faces to triangles
            bpy.data.objects[i].select = True
            bpy.context.scene.objects.active = bpy.data.objects[i]

            bpy.ops.object.mode_set(mode='EDIT')

            bpy.ops.mesh.select_all(action='SELECT')
            bpy.ops.mesh.quads_convert_to_tris()
            bpy.context.scene.update()

            bpy.ops.object.mode_set(mode='OBJECT')

            bpy.data.objects[i].select = False

            # add data to scene_data structure
            scene_data.append({
                "name"          : bpy.data.objects[i].name,
                "vertices"      : [],
                "indices"       : [],
                "normals"       : [],
                "tex_coords"    : []
            })

            # iterate over all the vertices in the mesh
            for j in range(len(bpy.data.objects[i].data.vertices)):
                # add vertex to scene_data structure
                scene_data[mesh_number]["vertices"].append( bpy.data.objects[i].data.vertices[j].co.x + bpy.data.objects[i].location.x )
                scene_data[mesh_number]["vertices"].append( bpy.data.objects[i].data.vertices[j].co.z + bpy.data.objects[i].location.z )
                scene_data[mesh_number]["vertices"].append( -(bpy.data.objects[i].data.vertices[j].co.y + bpy.data.objects[i].location.y) )

                # add vertex normal to scene_data structure
                scene_data[mesh_number]["normals"].append( bpy.data.objects[i].data.vertices[j].normal.x )
                scene_data[mesh_number]["normals"].append( bpy.data.objects[i].data.vertices[j].normal.z )
                scene_data[mesh_number]["normals"].append( -(bpy.data.objects[i].data.vertices[j].normal.y) )

            # iterate over each face in the mesh
            for j in range(len(bpy.data.objects[i].data.polygons)):
                verts_in_face = bpy.data.objects[i].data.polygons[j].vertices[:]

                # iterate over each vertex in the face
                for k in range(len(verts_in_face)):

                    # twiddle index for -Z forward, Y up
                    index = k
                    if index == 1: index = 2
                    elif index == 2: index = 1

                    # twiddle index so we draw triangles counter-clockwise
                    if index == 0:  index = 2
                    elif index == 2: index = 0

                    # add index to scene_data structure
                    scene_data[mesh_number]["indices"].append( verts_in_face[index] )

            # add texture coordinates to scene_data structure
            m = bpy.context.active_object.to_mesh(bpy.context.scene, True, 'PREVIEW')
            for j in range(len(m.tessfaces)):
                if len(m.tessface_uv_textures) > 0:
                    scene_data[mesh_number]["tex_coords"].append( m.tessface_uv_textures.active.data[j].uv1.x )
                    scene_data[mesh_number]["tex_coords"].append( m.tessface_uv_textures.active.data[j].uv1.y )
                    scene_data[mesh_number]["tex_coords"].append( m.tessface_uv_textures.active.data[j].uv2.x )
                    scene_data[mesh_number]["tex_coords"].append( m.tessface_uv_textures.active.data[j].uv2.y )
                    scene_data[mesh_number]["tex_coords"].append( m.tessface_uv_textures.active.data[j].uv3.x )
                    scene_data[mesh_number]["tex_coords"].append( m.tessface_uv_textures.active.data[j].uv3.y )

    return json.dumps(scene_data, indent=4)

誰かが私が間違っていることを教えてくれませんか?私はこれに数日間いて、進歩はありません。

4

1 に答える 1

0

さらに調査すると、問題を知っているかもしれないと思いますが、これについてはわかりません...

ここ から: http://www.gamedev.net/topic/602169-opengl-drawing-cube-using-gldrawelements-and-gltexcoordpointer/page_p_4811454#entry4811454

これは、共有頂点を使用できない場合の典型的な例です。位置以外の頂点属性を導入するとすぐに、立方体には 8 個ではなく 24 個の頂点が必要になります。立方体の角は、同じテクスチャ座標を持たないため、共有頂点ではありません。

たとえば、最初の 2 つの三角形はインデックス [0, 1, 2, 0, 2, 3] で構成されており、頂点とテクスチャの座標配列を参照する場合、その面は問題ありません。2 番目の 2 つの三角形はインデックス [0, 4, 5, 0, 5, 1] で構成され、頂点配列は立方体の 2 番目の面を作成するために正しく参照されますが、結果のテクスチャ座標は完全に壊れています。

これが私の問題であることについて私は正しいですか、それとも私は道を外れていますか?

編集: より多くの頂点位置を使用することで、テクスチャがほとんど機能するようになりました。唯一の問題は、単純な立方体の 1 つの面が歪んで正しい位置に斜めになることです。他の顔はみんな元気です。

ほとんど機能している機能は次のとおりです。

def get_json(objects, scene):
    """ Currently only supports one scene. 
        Exports with -Z forward, Y up. """

    object_number = -1
    scene_data = []

    # for every object in the scene
    for object in bpy.context.scene.objects:

        # if the object is a mesh       
        if object.type == 'MESH':

            object_number += 1

            # convert all the mesh's faces to triangles
            bpy.ops.object.mode_set(mode='OBJECT')
            object.select = True
            bpy.context.scene.objects.active = object

            # triangulate using new Blender 2.65 Triangulate modifier
            bpy.ops.object.modifier_add(type='TRIANGULATE')
            object.modifiers["Triangulate"].use_beauty = False
            bpy.ops.object.modifier_apply(apply_as="DATA", modifier="Triangulate")

            bpy.ops.object.mode_set(mode='OBJECT')

            object.select = False

            # add data to scene_data structure
            scene_data.append({
                "name"          : object.name,
                "vertices"      : [],
                "indices"       : [],
                "normals"       : [],
                "tex_coords"    : []
            })

            vertex_number = -1

            # for each face in the object
            for face in object.data.polygons:
                vertices_in_face = face.vertices[:]

                # for each vertex in the face
                for vertex in vertices_in_face:

                    vertex_number += 1

                    # store vertices in scene_data structure
                    scene_data[object_number]["vertices"].append( object.data.vertices[vertex].co.x + object.location.x )
                    scene_data[object_number]["vertices"].append( object.data.vertices[vertex].co.z + object.location.z )
                    scene_data[object_number]["vertices"].append( -(object.data.vertices[vertex].co.y + object.location.y) )

                    # store normals in scene_data structure
                    scene_data[object_number]["normals"].append( object.data.vertices[vertex].normal.x )
                    scene_data[object_number]["normals"].append( object.data.vertices[vertex].normal.z )
                    scene_data[object_number]["normals"].append( -(object.data.vertices[vertex].normal.y) )

                    # store indices in scene_data structure
                    scene_data[object_number]["indices"].append(vertex_number)

            # texture coordinates
            #   bug: for a simple cube, one face's texture is warped
            mesh = object.to_mesh(bpy.context.scene, True, 'PREVIEW')
            if len(mesh.tessface_uv_textures) > 0:
                for data in mesh.tessface_uv_textures.active.data:
                    scene_data[object_number]["tex_coords"].append( data.uv1.x )
                    scene_data[object_number]["tex_coords"].append( data.uv1.y )
                    scene_data[object_number]["tex_coords"].append( data.uv2.x )
                    scene_data[object_number]["tex_coords"].append( data.uv2.y )
                    scene_data[object_number]["tex_coords"].append( data.uv3.x )
                    scene_data[object_number]["tex_coords"].append( data.uv3.y )

    return json.dumps(scene_data, indent=4)

1 つの面だけのテクスチャがゆがんでいる原因は何でしょうか? 私はほとんどそこにいますが、これを理解できないようです。

于 2012-12-06T19:38:06.620 に答える