2010-06-02 3 views
2

블렌더로 만든 3D 모델을 기반으로지도 타일을 만드는 중입니다.블렌더로 타일지도 만들기

지도는 16x16 블렌더로되어 있습니다.

4 가지 확대/축소 수준이 있고 각 타일은 100 x 100 픽셀입니다. 가장 축소 수준에서 전체지도는 가장 수준 확대 400 X 400

의 이미지를 구성하는 4 × 4 타일입니다 분명 내가 필요로 무엇 25600 X 25600

의 이미지를 구성하는 256 X 256 모델에서 타일을 만들 수있는 블렌더 용 스크립트입니다.

나는 이미 파이썬으로 작성한 적이 없으므로 이미 이미 존재하는 몇 가지 스크립트를 적용하려고 노력해 왔습니다.

지금까지 스크립트를 생각해 냈지만 제대로 작동하지 않습니다. 타일을 매끄럽게 정렬하는 데 어려움을 겪고 있습니다. 6400 x 6400 이미지에서 항상 동일한 축소 된 타일을 만들고 결과 이미지를 올바른 타일로 분할 할 수 있으므로 카메라의 높이를 변경하는 것에 대해서는별로 신경 쓰지 않습니다. 여기

이것은 결국 상대적으로 간단

#!BPY 

""" 
Name: 'Export Map Tiles' 
Blender: '242' 
Group: 'Export' 
Tip: 'Export to Map' 
""" 

import Blender 
from Blender import Scene,sys 
from Blender.Scene import Render 

def init(): 
     thumbsize = 200 
     CameraHeight = 4.4 
     YStart = -8 
     YMove = 4 
     XStart = -8 
     XMove = 4 
     ZoomLevel = 1 
     Path = "/Images/Map/" 
     Blender.drawmap = [thumbsize,CameraHeight,YStart,YMove,XStart,XMove,ZoomLevel,Path] 


def show_prefs(): 
     buttonthumbsize = Blender.Draw.Create(Blender.drawmap[0]); 
     buttonCameraHeight = Blender.Draw.Create(Blender.drawmap[1]) 
     buttonYStart = Blender.Draw.Create(Blender.drawmap[2]) 
     buttonYMove = Blender.Draw.Create(Blender.drawmap[3]) 
     buttonXStart = Blender.Draw.Create(Blender.drawmap[4]) 
     buttonXMove = Blender.Draw.Create(Blender.drawmap[5]) 
     buttonZoomLevel = Blender.Draw.Create(Blender.drawmap[6]) 
     buttonPath = Blender.Draw.Create(Blender.drawmap[7]) 

    block = [] 
    block.append(("Image Size", buttonthumbsize, 0, 500)) 
    block.append(("Camera Height", buttonCameraHeight, -0, 10)) 
    block.append(("Y Start", buttonYStart, -10, 10)) 
    block.append(("Y Move", buttonYMove, 0, 5)) 
    block.append(("X Start", buttonXStart,-10, 10)) 
    block.append(("X Move", buttonXMove, 0, 5)) 
    block.append(("Zoom Level", buttonZoomLevel, 1, 10)) 
    block.append(("Export Path", buttonPath,0,200,"The Path to save the tiles")) 

    retval = Blender.Draw.PupBlock("Draw Map: Preferences" , block) 

    if retval: 
     Blender.drawmap[0] = buttonthumbsize.val 
     Blender.drawmap[1] = buttonCameraHeight.val 
     Blender.drawmap[2] = buttonYStart.val 
     Blender.drawmap[3] = buttonYMove.val 
     Blender.drawmap[4] = buttonXStart.val 
     Blender.drawmap[5] = buttonXMove.val 
     Blender.drawmap[6] = buttonZoomLevel.val 
     Blender.drawmap[7] = buttonPath.val 
     Export() 

def Export(): 
    scn = Scene.GetCurrent() 
    context = scn.getRenderingContext() 

    def cutStr(str): #cut off path leaving name 
     c = str.find("\\") 
     while c != -1: 
      c = c + 1 
      str = str[c:] 
      c = str.find("\\") 

     str = str[:-6] 
     return str 

    #variables from gui: 
    thumbsize,CameraHeight,YStart,YMove,XStart,XMove,ZoomLevel,Path = Blender.drawmap 


    XMove = XMove/ZoomLevel 
    YMove = YMove/ZoomLevel 
    Camera = Scene.GetCurrent().getCurrentCamera() 
    Camera.LocZ = CameraHeight/ZoomLevel 
    YStart = YStart + (YMove/2) 
    XStart = XStart + (XMove/2) 

    #Point it straight down 
    Camera.RotX = 0 
    Camera.RotY = 0 
    Camera.RotZ = 0 
    TileCount = 4**ZoomLevel 
    #Because the first thing we do is move the camera, start it off the map 
    Camera.LocY = YStart - YMove 
    for i in range(0,TileCount): 
     Camera.LocY = Camera.LocY + YMove 
     Camera.LocX = XStart - XMove 
     for j in range(0,TileCount): 
      Camera.LocX = Camera.LocX + XMove 
      Render.EnableDispWin() 
      context.extensions = True 
      context.renderPath = Path 

      #setting thumbsize 
      context.imageSizeX(thumbsize) 
      context.imageSizeY(thumbsize) 

      #could be put into a gui. 
      context.imageType = Render.PNG 
      context.enableOversampling(0) 

      #render 
      context.render() 

      #save image 
      ZasString = '%s' %(int(ZoomLevel)) 
      XasString = '%s' %(int(j+1)) 
      YasString = '%s' %(int((3-i)+1)) 
      context.saveRenderedImage("Z" + ZasString + "X" + XasString + "Y" + YasString) 

      #close the windows 

      Render.CloseRenderWindow() 

try: 
     type(Blender.drawmap) 
except: 
     #print 'initialize extern variables' 
     init() 
show_prefs()  

답변

0

... 내가 지금까지있어 것입니다.

지도의 1 타일이 블렌더에서 1 그리드가되도록 모델의 크기를 조정했습니다.

카메라를 직교로 설정하십시오.

카메라의 눈금을 최고 배율로 1, 다음 배율로 4, 다음 배율로 16 등으로 설정하십시오.

시작 좌표와 그에 따른 이동 값을 업데이트했습니다.