본문 바로가기

Unreal Engine

3dsMax Spline -> Unreal Engine Spline 으로 Export

3dsMax의 Spline 을 Unreal Engine으로 Copy & Paste 하기

원본 스크립트 주소

https://github.com/defrost256/SplineExport/blob/master/SplineExporter.mcr

 

아주 예전에 작성된 이후 업데이트 되지 않은 듯 하다.

MaxScript로 클립보드에 Spline 정보를 SplineComponent 의 Point 정보로 변환해서 넣어 준다.

 

핵심 Script

  • setClipboardText <string>

클립보드 내용에 string을 넘겨준다.

outputstr 을 "" 으로 초기화하고, 필요한 정보를 각 spline을 iterate 하면서 누적한다.

필요한 정보가 string 에 모두 모였으면, setClipboard 로 클립보드에 내용을 전달한다.

https://help.autodesk.com/view/MAXDEV/2023/ENU/?guid=GUID-E4E93BC6-C0C2-435B-BE00-DC6C5406A0A7

 

Help

 

help.autodesk.com

문서 내용을 봤을 때 Text 뿐만 아니라 Bitmap 형태의 데이터도 저장하거나 불러올 수 있는 듯 하다.

 

  • format <string> <value> to:<string>

print 와 달리 " "(따옴표) 가 없는 순수 string을 반환한다.

string에 % 문자가 포함되어 있으면, 이것을 뒤에 오는 value 들로 순서대로 대체한다.  

to: 뒤에 오는 string 변수에 결과값을 누적한다.

format "%" ( $.pos) -- Just make sure only one object selected in the scene

[10,10,0]

format "object position= %" ( $.pos)

object position=[10,10,0]

format "name:% pos:% rot:%" $.name $.pos $.rotation

name:Box001 pos:[10,10,0] rot:(quat 0 0 0 1)

 

위.SplineExporter 스크립트에서는 %를 포함한 스트링 템플릿을 미리 만들어 두고, 이후 여기에 값을 format으로 넣어주는 방식으로 사용하였다.

 

        splinePointTempl = "(InVal=%,OutVal=(X=%,Y=%,Z=%),"
        
        -- ...
        
              	if i != 1 then
      			(
                format splinePointTempl (i - 1) vertPosArray[i][1] vertPosArray[i][2] vertPosArray[i][3] to:outputStr
  			    )

 

https://www.vfxarabia.co/maxscript-tutorial-print-vs-format

 

string 내용 중 tab 은 \t, 줄바꿈은 \n, 따옴표는 \" 으로 표현해야 한다.

 

클립보드에 저장된 내용

클립보드에 저장된 내용의 형식은 아래와 같다.

Begin Map
	Begin Level
		Begin Actor Class=Actor Name=Spline
			Begin Object Class=SplineComponent Name="SplineComp" 
				SplineCurves=(Position=(Points=((... 포인트 정보들 나열))
				bSplineHasBeenEdited=True
				RelativeLocation=(X=-6572.528811,Y=6904.538678,Z=1123.102227)
				RelativeRotation=(Pitch=-0.000000,Yaw=-179.999999,Roll=0.000000)
				UCSSerializationIndex=0
				bNetAddressable=True
				CreationMethod=Instance
			End Object
			RootComponent=SplineComponent'SplineComp'
			nstanceComponents(0)=SplineComponent'SplineComp'
			ActorLabel="SplineCopied"
		End Actor
	End Level
Begin Surface
End Surface
End Map

 

SplineCurves= .. 로 되어 있는 부분에 Spline Point 의 위치, Tangent 정보 등이 들어있다.

액터의 실제 월드 Transform은 RootComponent 의 Relative Transform을 따른다. 정해주지 않으면 Scale은 1로, Rotation, Translation은 0으로 자동으로 들어간다.

여러 개의 액터를 복사하는 경우라면 Begin Actor ~ End Actor 부분이 여러 번 반복된다.

 

구조만 알아두면, 파라미터만 변경해서 여러 가지 용도로 응용해 볼 수 있을 듯 하다.

 

개선된 SplineExporter

위 스크립트를 실행해서 Spline을 복사해 보면, 위치 정보가 제대로 들어가지 않아 스플라인이 월드 중앙에 덜렁 배치된다.

게다가 Spline 오브젝트 1개만 복사되기 때문에, Spline 갯수가 여러 개일 경우 일일히 노가다 해줘야 한다.

 

아래는 내가 필요해서 개선해 본 스크립트이다.

UE5-UE5splineWriter.mcr
0.01MB

 

3dsMax에서 Export 하면..
Ctrl + V 로 액터 형태로 바로 붙여넣을 수 있다.

 

개선된 점은 아래와 같다.

  • 여러 개의 Spline을 Copy 가능
    • 선택된 오브젝트 중 Spline 타입이 아닌 오브젝트는 배제함
    • Actor Label 에 각 Spline의 이름 부여
  • RelativeLocation(X= …) → RelativeLocation=(X=…) 으로 변경
    (이렇게 해야 제대로 동작함) Rotation, Scale의 경우도 마찬가지
  • UE4 → UE5로 매크로 이름 및 대화상자 이름 변경

또, MaxScript 창에서 스크립팅 하는 게 너무 빡세서 아래 VS Code 확장을 사용해 보았는데, 역시 훨씬 낫다.

https://marketplace.visualstudio.com/items?itemName=atelierbump.language-maxscript

 

Language MaxScript - Visual Studio Marketplace

Extension for Visual Studio Code - Autodesk 3ds Max MaxScript language support

marketplace.visualstudio.com