보통 Modo에서 인체 모델링을 한다고 하면
모델링 도중에 면을 부드럽게 봐야할때 Tab를 클릭하면 XSI의 Page up처름 면이 부드럽게 됩니다.
그리고 한번 더 Tab를 클릭하면 XSI의 Page Down처름 다시 원래의 상태로 돌아오죠.
그런식으로 Tab키를 눌러가며 모델링을 하게 되는데요.
3D프로그램은 마야부터 시작했던 저로써는 Modo의 Tab키는 상당히 편리하게 느껴졌던 부분입니다.
그래서 Cinema 4D에서 모델링할때 역시 섭디비젼이 적용되는것을 Tab로 할당하고 사용중입니다.
일단 키 자체가 크고 손이 쉽게 가는곳이라 중간 중간 눌러주기가 아주 쉽기 때문이죠.
그런데 XSI를 시작한지 어느덧 한달정도가 되어가는 지금 저는 Page Up과 Page Down으로 사용중입니다.
혹시 유저분들은 그렇게 사용하시나요? 아니면 따로 스크립트를 만들어 쓰시는지요?
위치도 많이쓰는 S키 주위와 멀리있다보니 키의 위치가 너무 비효율적인듯해서요.
XSI에서 Page Up을 한번누르면 면이 좀 덜 부드럽습니다. 두번쯤 눌러야 보기좋은 상태가 되죠.
Modo라는 프로그램에서 Tab키를 한번 눌렀을때 부드러운 정도는 Xsi에서 Page Up을 두번정도 누르는 것과 비슷하게 보이는데요.
그래서 요점을 말씀드리자면 XSI에서 Tab키에 단축키를 할당해서 토글모드로 Page Up,Down을 왔다 갔다 하고싶습니다.
...........................................................................................................................................................................................................
Tab클릭
IncreaseSubdivision
IncreaseSubdivision
Tab클릭
DecreaseSubdivision
DecreaseSubdivision
...........................................................................................................................................................................................................
위와같은 식으로 말이죠.
두단계가 어렵다면 한단계만이라도 Tab키를 눌러서 가능하게 하고 싶습니다.
아마 스크립트로 작성해야 할듯한데 궁금합니다.
어떤 방법이 가장 좋을까요?
신선
- 2009.05.25
- 11:52:25
보통 모델링할때 서브디비젼 레벨을 자주 왔다갔다 하는 편이 아니어서 단축키 불편함을 못느끼고 있습니다.
샤이닝님께서 자주 왔다갔다하신다면 로폴과 섭디 두가지모드를 동시에 시각화 해주는 모드(polymesh hull)가 있습니다..
참고 이미지 올립니다. 이미 아시는거라면 패스~ ^^

CGnDEV
- 2009.05.25
- 13:14:18
아... 원하시는게 tab키를 2번누르기전가지는 인크리즈, 다시 3번째에서 4번째 누르는건 디크리즈를 하시려는거군요.
스크립트로 하는 방법 밖에 없을 듯 합니다.
아니면.. + , - 에 대한 단축키를 S키 근처로 옮기는게 좋지 않을까요?
그래픽작업이 오래걸리고 운동도 부족할텐데..
그냥 S키와 멀리있는 +, - 키를 쓰시는것을 추천합니다. 팔 운동이라도 해야죠 ^^
완전 혼자 작업하실때는 커스터마이징 하시는게 좋지만, 아시겠지만 너무 커스터마이징 하시려는거도 나중에 좀 불편할수있습니다.
참고 하시구요.. 요청 하시면 말씀드린 기능 만들어드릴께요 ^^ 지금은 시간이 안되네요. ㅜㅜ
샤이닝
- 2009.05.25
- 14:24:58
가끔 저도 멀리있는건 그냥 그대로 쓰자라는 생각을 합니다 ^^
역시 나와같은 생각을 하는 사람들은 세상에 많다는 것을 또 한번 느끼게 하네요. ^-^;
혹시 설명에 착오가 있는것같아서 다시 말씀드리자면.
Tab키를 한번 눌렀을때 + 키를 두번 누른것과같은 적용이 되고,
다시 Tab키를 한번 더 누르면. - 키를 두번 누른것처럼 원래대로 돌아오게 하고 싶습니다.
일단 제가 XSI를 시작한지 너무 얼마 안되다보니 제작하기가 어렵네요. 제작하는데 힌트라도 주시면 시도해볼텐데요.
얼마전에 True False로 이뤄지는 한가지 명령어의 토글은 if, then,else로 만들어주셔서 잘 적용하고 있는데요
이건 하나의 기능을 두번 반복하고 또다른 기능을 두번 바복하는것을 서로 토글해야하니까 어떻게 만들지 어렵습니다.
시간이 되실때 꼭 좀 부탁드리겠습니다. 조금 늦더라도 기다리겠습니다.
앞으로도 스크립트 만드는데 궁금한 사항이 있으면 많은 도움 부탁드립니다.
풰이스로봇
- 2009.05.25
- 23:10:36
저는 포기하렵니다...ㅡ;ㅡ
이것이 CHANGESUBDIVISION 스크립트인데...수정해볼라햇드만.,ㅡㅡ;
ub ChangeSubdivisionProc( in_InputObjs, in_updir )
dim curval, l_objects, l_obj, tstnode, tstbrch, delta
dim maxsubd, minsubd, maxstep, minstep
maxsubd = 4
minsubd = 0
maxstep = 5
minstep = 1
' Prepare delta depending on direction
if ( in_updir ) then
delta = 1
else
delta = -1
end if
Set l_objects = SIFilter(in_InputObjs, "sceneobject")
set l_donelist = CreateObject("XSI.Collection")
l_donelist.unique = true
if TypeName(l_objects) <> "Nothing" then
dim maxhit, minhit, maxoglhit, minoglhit, minrenhit, maxrenhit
maxhit = 0
minhit = 0
for each l_obj in l_objects
if (l_obj.Type = "polymsh") or (l_obj.Type = "crvlist") or (l_obj.Type = "surfmsh") or (l_obj.Type = "hair") then
' Check silently first if we have a local geom approx property (node or branch)
set prop = Dictionary.GetObject(l_obj & ".geomapprox")
if ( not prop.IsA( siLocalPSet ) ) then
MakeLocal l_obj & ".geomapprox", siDefaultPropagation
end if
' Change subdivision level if within boundaries
'------------ Polygon Meshes ------------------------
if l_obj.Type = "polymsh" then
' Rendering level
dim renval, oglval
renval = GetValue (l_obj & ".geomapprox.gapproxmordrsl")
oglval = GetValue (l_obj & ".geomapprox.gapproxmosl")
if in_updir then
if renval >= maxsubd and oglval >= maxsubd then
maxhit = maxhit + 1
' logmessage "OGL and rendering subdivision level reached maximum for object " & l_obj
elseif renval >= maxsubd then
' logmessage "Rendering subdivision level reached maximum for object " & l_obj
maxhit = maxhit + 1
SetValue l_obj & ".geomapprox.gapproxmosl", oglval + delta
elseif oglval >= maxsubd then
' logmessage "OGL subdivision level reached maximum for object " & l_obj
maxhit = maxhit + 1
SetValue l_obj & ".geomapprox.gapproxmordrsl", renval + delta
else
SetValue l_obj & ".geomapprox.gapproxmosl," & l_obj & ".geomapprox.gapproxmordrsl", Array(oglval+delta,renval+delta)
end if
else
if renval = minsubd and oglval = minsubd then
' logmessage "OGL and rendering subdivision level at minimum for object " & l_obj
minhit = minhit + 1
elseif renval = minsubd then
' logmessage "Rendering subdivision level at minimum for object " & l_obj
minhit = minhit + 1
SetValue l_obj & ".geomapprox.gapproxmosl", oglval + delta
elseif oglval = minsubd then
' logmessage "OGL subdivision level at minimum for object " & l_obj
minhit = minhit + 1
SetValue l_obj & ".geomapprox.gapproxmordrsl", renval + delta
else
SetValue l_obj & ".geomapprox.gapproxmosl," & l_obj & ".geomapprox.gapproxmordrsl", Array(oglval+delta,renval+delta)
end if
end if
'------------ Curves ------------------------
elseif l_obj.Type = "crvlist" then
curval = GetValue (l_obj & ".geomapprox.gapproxvwcustep")
if in_updir and curval >= maxstep then
maxhit = maxhit + 1
' logmessage "Step level reached maximum for object " & l_obj
elseif (not in_updir) and curval = minstep then
minhit = minhit + 1
' logmessage "Step already at minimum for object " & l_obj
else
SetValue l_obj & ".geomapprox.gapproxvwcustep", curval + delta
end if
'------------ Surface Meshes ------------------------
elseif l_obj.Type = "surfmsh" then
curval = GetValue (l_obj & ".geomapprox.gapproxvwustep")
if in_updir and curval >= maxstep then
maxhit = maxhit + 1
' logmessage "Step level reached maximum for object " & l_obj
elseif (not in_updir) and curval = minstep then
minhit = minhit + 1
' logmessage "Step already at minimum for object " & l_obj
else
SetValue l_obj & ".geomapprox.gapproxvwustep", curval + delta
SetValue l_obj & ".geomapprox.gapproxvwvstep", curval + delta
end if
'------------ Hair Objects ------------------------
else ' Hair
' Make sure we're not in linear mode
if GetValue( l_obj & ".geomapprox.gapproxhocrvdeg" ) <> 1 then
' Rendering level
renval = GetValue (l_obj & ".geomapprox.gapproxhocrvrsl")
oglval = GetValue (l_obj & ".geomapprox.gapproxhocrvosl")
if in_updir then
if renval >= maxsubd and oglval >= maxsubd then
' logmessage "OGL and rendering subdivision level reached maximum for object " & l_obj
maxhit = maxhit + 1
elseif renval >= maxsubd then
' logmessage "Rendering subdivision level reached maximum for object " & l_obj
maxhit = maxhit + 1
SetValue l_obj & ".geomapprox.gapproxhocrvosl", oglval + delta
elseif oglval >= maxsubd then
' logmessage "OGL subdivision level reached maximum for object " & l_obj
maxhit = maxhit + 1
SetValue l_obj & ".geomapprox.gapproxhocrvrsl", renval + delta
else
SetValue l_obj & ".geomapprox.gapproxhocrvosl," & l_obj & ".geomapprox.gapproxhocrvrsl", Array(oglval+delta,renval+delta)
end if
else
if renval = minsubd and oglval = minsubd then
' logmessage "OGL and rendering subdivision level at minimum for object " & l_obj
minhit = minhit + 1
elseif renval = minsubd then
' logmessage "Rendering subdivision level at minimum for object " & l_obj
minhit = minhit + 1
SetValue l_obj & ".geomapprox.gapproxhocrvosl", oglval + delta
elseif oglval = minsubd then
' logmessage "OGL subdivision level at minimum for object " & l_obj
minhit = minhit + 1
SetValue l_obj & ".geomapprox.gapproxhocrvrsl", renval + delta
else
SetValue l_obj & ".geomapprox.gapproxhocrvosl," & l_obj & ".geomapprox.gapproxhocrvrsl", Array(oglval+delta,renval+delta)
end if
end if
end if
end if
else
' logmessage "Approximation level cannot be changed for object '" & l_obj & "'"
end if
next
if minhit = 1 then
logmessage "An object has hit the minimum OGL and/or rendering subdivision limit."
elseif minhit > 1 then
logmessage minhit & " objects have hit their minimum OGL and/or rendering subdivision limit."
end if
if maxhit = 1 then
logmessage "An object has hit the maximum OGL and/or rendering subdivision limit."
elseif maxhit > 1 then
logmessage maxhit & " objects have hit their maximum OGL and/or rendering subdivision limit."
end if
end if
end sub
샤이닝
- 2010.08.17
- 01:28:24
오토핫키라는 단축키 변경하는 프로그램에서 간단히 해결되네요.
http://www.autohotkey.pe.kr/bbs/board.php?bo_table=qna&wr_id=10932#c_10938
Tab:: ;Tab키를 눌렀을때
flag:=!flag ;flag의 값을 a키가 눌릴때마다 0 > 1, 1 > 0 으로 바꿔줍니다.
msg:=flag ? "{PGUP}":"{PGDN}" ;flag의 값에 따라 msg의 내용을 1과 2로 정해줍니다.
send,%msg% ;변수 msg의 내용을 send합니다.
return
물론 "{PGUP}{PGUP}":"{PGDN}{PGDN}" 이런식으로 하면 두번 제가 질문한것과 같이 두단계로 올라갔다 내려갔다 합니다.
키 하나당 두개의 명령어를 번갈아 가며 사용하는경우 다른키들도 응용하면 좋겠네요.
전 소프트이미지 할때 사용하지 않는 큼지막한 CapsLocks도 원하는것으로 적용했어요.
CGnDEV
- 2010.08.17
- 11:08:49
자~~~ 아래에 완성했습니다.
아래 코드를 그림처럼 넣고, 테스트해보세요.
소스를 실행시키는 F5 키를 누르면 번갈아가면서 섭디비전이 왔다 갔다 하는걸 볼 수 있을꺼에요.
프로퍼티를 만들어서 전역변수처럼 쓰는걸 추천하는데 그건 좀 어렵구요.
간단한거는 아래처럼 SetGlobal, GetGlobal 을 사용하면됩니다.
Python 코드로 해놓은거구요.
이걸 코맨드로 만들어서 단축키 지정하시면 되겠습니다. ^^
app = Application
try :
tFlag = app.GetGlobal( "gXToggle" )
except:
app.SetGlobal( "gXToggle", 0 )
tFlag = 0
tFlag = app.GetGlobal( "gXToggle" )
if not( tFlag ) :
app.SetGlobal( "gXToggle", 1 )
app.IncreaseSubdivision( "" )
else :
app.SetGlobal( "gXToggle", 0 )
app.DecreaseSubdivision( "" )

음,,질문에 대한 답변은 아니지만,,
기본 xsi 단축키는 키패드 +, -로 되어 있습니다,,
아마, 대부분 이 상태로 쓰시지 않을까 싶은데요,, ^^;;