2013年8月28日水曜日

EF-12 背景を作るのこと その2 とりあえずCubeMap

最遠景であるCubeMapの制作をします

材料は
・全周囲の画像

制作ツールは
・Softimage
AMD CubeMapGen

デス


全周囲画像


全周囲の画像は撮りためてたHDRマップを使います。
ちなみにいままで仕事で一度も使えてません orz

仕様は 8BitRGB なので
Photoshopでトーンを調整しつつ

32bit > 8bitに落とし、
余分なものを削除します。

地面はSIで製作しますので、鏡面にし、リタッチしました。



おおう、我ながらすばらしい。


SoftimageでCubeMap用の背景の作成


キューブマップ用にモデリングします
とはいっても、地面と、天球です。
ちょいちょいと。
天球と地面の接触部、地平線をなじませるため透明度など入れてます
フェイクフェイク。

で、CubeMap用のカメラをスクリプトで作成します。


CubeMapMaker

#Python
#CubeMapMaker
#CubeMapのためのカメラ、Passを製作します
#
#10 16 2012
#

app = Application; log = app.LogMessage

Cameras = ["x","xi","z","zi","y","yi"]
D3D = True
CameraInterPos_D3D = [[1,0,0],[-1,0,0],[0,0,1],[0,0,-1],[0,1,0],[0,-1,0]]
CameraInterPos_OGL = [[1,0,0],[-1,0,0],[0,0,1],[0,0,-1],[0,-1,0],[0,1,0]]
ImageSize = 1024

def createPass(in_Cam):
 oCam = in_Cam
 
 oCurrentPass = app.ActiveProject.ActiveScene.ActivePass
 oPass = app.CreatePass("pass",oCam.Name + "_Pass")(0)
 app.SetValue(str(oPass) + ".Main.Format", "tga", "")
 oPass.Camera = oCam
 oPass.ImageFormatOverride = True
 oPass.ImageFormatPreset = 0
 oPass.ImageLockAspectRatio = False
 oPass.ImagePixelRatio   = 1
 oPass.ImageAspectRatio  = 1
 oPass.ImageWidth  = ImageSize
 oPass.ImageHeight = ImageSize
 return oPass
 
 
def setCamParam(in_Cam):
 oCam = in_Cam
 oCam.std   = 0
 oCam.aspect  = 1
 oCam.pixelratio = 1
 oCam.fov   = 90


def createCubeMapCamera():
 oRoot = app.ActiveSceneRoot
 oModel = oRoot.AddModel("","CubeCameras")
 oPos = XSIMath.CreateVector3()
 oCamColl = XSIFactory.CreateObject("XSI.Collection")
 
 for i,oCamName in enumerate(Cameras):
 
  oCam = oModel.AddCamera("Camera",oCamName)
  oInter = oCam.Interest
  oInter.Name = oCamName + "_Interest"
  if D3D == True:
   oPos.Set(
    CameraInterPos_D3D[i][0],
    CameraInterPos_D3D[i][1],
    CameraInterPos_D3D[i][2])
  else:
   oPos.Set(
    CameraInterPos_OGL[i][0],
    CameraInterPos_OGL[i][1],
    CameraInterPos_OGL[i][2])
   
  oTrans = oInter.Kinematics.Global.Transform
  oTrans.SetTranslation(oPos)
  oInter.Kinematics.Global.Transform = oTrans
  
  #yAxiz upVect
  if i == 4:
   oCam.Kinematics.Global.rotY = 0
  if i == 5:
   oCam.Kinematics.Global.rotY = 0
   
  setCamParam(oCam)
  oCamColl.Add(oCam)  
 return oCamColl


#PPG現在は作成していない
def addCustomProp():
 oRoot = app.ActiveSceneRoot
 for oProp in oRoot.Properties:
  if oProp.Name == "CubeMapPPG":
   return oProp
   
 oProp = oRoot.AddCustomProperty("CubeMapPPG")
 ol = oProp.PPGLayout
 oItem = ol.AddButton("CreateCubeMapCameras")
 oItem = ol.AddButton("RenderCubeMap")
 return oProp
 
 
def main():

 oCams = createCubeMapCamera()
 aPassColl = XSIFactory.CreateObject("XSI.Collection")
 
 for oCam in oCams:
  setCamParam(oCam)
  
 for oCam in oCams:
  oPass = createPass(oCam)
  aPassColl.Add(oPass)
 
# CFrame = app.GetValue("PlayControl.Current")
# for oPass in aPassColl:
#  app.RenderPasses(oPass, CFrame, CFrame, 1, "siRenderVerbosityDefault")
#  
 #app.DeleteObj(aPassColl)

 #oProp = addCustomProp()
 #app.InspectObj(oProp)

 
main()


PPGを作るつもりで、途中で投げてますね
まあ、必要十分ということでさらしておきます :p

6方向それぞれののパスが出来ますので
カレントフレームをAll Passで
レンダリングしていただければOKです


CubeMapGen




ATIのCubeMapGenでレンダリングした画像を読み込み、
dds形式で保存します

おおう、z ,ziが逆ですた :p
CubeMapGenは確認しながら設定できるので楽ですね(ごまかした

というわけで書き出したddsがこちらになります




EF-12に組み込む

ddsの名前をSkyFine.ddsにしたならば、上書きでOKです
stg\userstage\sky\SkyFine
こちらのフォルダのファイルに上書きしちゃいましょう



というわけでCubeMapの検証が取れました :p

おつかれさまでした :p


実は全周囲画像を用意するというのが、一番ハードルが高かったりします orz

0 件のコメント:

コメントを投稿