2012-12-05 2 views
0

블렌더 2.6x 용 간단한 JSON 내보내기 도구를 작성하려고합니다. (http://code.google.com/p/blender-machete/) 2.6에서 작동하지 않습니다. 블렌더에서 정점, 법선 및 인덱스를 얻는 데 아무런 문제가 없었지만 가능한 한 시도해 보았습니다. 왜 텍스처 좌표가 잘못 나오는 지 알 수 없습니다. 텍스처는 단순한 큐브의면을 가로 질러 대각선으로 기울어 진 것처럼 보입니다. 그리고 쭉 뻗었습니다. 정말 못 생겼고 잘못되었습니다. 나는 공식적인 수출업자들을 위해 온라인을 통해 소스를 찾고 있었지만 아직도 그것을 이해할 수 없기 때문에 누군가가 나에게 약간의 힌트 나 해결책을 줄 수 있기를 바랬다.블렌더 2.6 JSON 내보내기, 텍스처 좌표 문제

내가 텍스처 좌표에 액세스하는 데 사용하고 코드의 조각은 이것이다 :

# 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) 

누군가 내가 잘못하고있는 것을 알려주시겠습니까? 나는 지금 아무런 진전없이 며칠 동안이 일을 해왔다. 추가 연구, 내가 문제를 알고 있다고 생각하지만, 나는 이것에 대해 잘 모르겠어요시

답변

0

...

여기에서

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

이 당신을 때의 고전적인 예이다 공유 꼭지점을 사용할 수 없습니다. 위치가 아닌 다른 꼭지점 특성을 도입하면 큐브에는 8이 아닌 24 개의 꼭지점이 있어야합니다. 큐브의 모서리는 동일한 꼭지점 좌표가 없기 때문에 공유 꼭지점이 아닙니다.

는 예를 들어, 첫 번째 두 개의 삼각형은 지수 [0, 1, 2, 0, 2, 3]는 정점과 질감 배열 좌표를 참조하는 경우와, 해당면 괜찮로 이루어진다. 두 번째 두 개의 삼각형은 개의 인덱스 [0, 4, 5, 0, 5, 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) 

:

여기에 거의 일하고 기능이다? 나는 거의 다 왔지만 이걸 알아낼 수는 없다.

관련 문제