--这个工具首先是对uv进行操作的。首先是要 hold 住在进行操作。
--******************************************************************************************************
-- Created: 05-05-2011
-- Last Updated: 05-05-2011
-- Version: 1.0
--
-- Author : Kostadin Kotev / miau_u@yahoo.com /
-- Version: 3ds max 2009 (should work in older versions too!)
--
-- Discription:
-- Randomly rotate the selected UV islands.
--
-- Usage:
-- UVW_Unwrap modifier must be applyed to object and the "Edit UVWs" rollout must be open.
-- Select some UV islands or select some verts,edges or faces of each UV islands and press the "Hold Selection" button.
-- Press the "Random Rotate" button several times.
--
--******************************************************************************************************
-- MODIFY THIS AT YOUR OWN RISK
/*
macroscript UVRandomRotate_v1
category:"miauu"
tooltip:"UV Random Rotate v1.0"
buttonText:"UV Random Rotate"
*/
---2011.9.02 盖天解释
--这个工具首先是对uv进行操作的。首先是要 hold 住在进行操作。
--这个好。
--通过使用和粗看我觉得是 随即的旋转uv 并且 hold 是旋转部分见整体。
--我现在觉得思路是记录所有点的位置, 加上移动位置 在设定旋转后的位置,
--2011.9.10 延迟了8 天进行操作。
(
global rol_UVRandomRotate
try(destroyDialog rol_UVRandomRotate)catch()
rollout rol_UVRandomRotate "UV Rotate"
(
local uvIslands = #()
local uv = undefined
local subObjLevel = undefined
checkbutton chkbtn_holdSelection "Hold Selection"
button btn_rotateRandom "Random Rotate"
function RandomRotateInVertSOL = ---这个函数就是把部分因素转到全部因素进行处理,--这个函数是对于点的操作,这个很好 有用。
(
-- get all selected vertices
allVerts = uv.getSelectedVertices() ---收积选择的点
if not allVerts.isEmpty then ---not allVerts.isEmpty 判断他是否有效的 我一搬都是转数组。
(
-- find and separate selected elements
while not allVerts.isEmpty do --这里真由必要吗、?
(
-- set the first vertex as selected
uv.selectVertices #{(allVerts as array)[1]}
-- select the element of that vertex
uv.SelectElement()-----选择因素的函数。
-- select all vertices of this element
elem01verts = uv.getSelectedVertices()
append uvIslands elem01verts ------------在一次收集选择的加入到数组。是把整个点的位组加入到了数组, 好在下面引用。
-- remove this vertices from original selection
allVerts = allVerts-elem01verts ---然后又清空了 难道这个能释放内存,不是max 自己收集吗,我从来没有注意过这个。
)
)
else
(
messagebox "Select some UV islands!" title:"miauu Script Error!!!"
chkbtn_holdSelection.state = false
)
)
--下面的操作和上面是一样的,也可以放到一个函数中进行判断。
function RandomRotateInEdgeSOL =
(
allEdges = uv.getSelectedEdges()
if not allEdges.isEmpty then
(
while not allEdges.isEmpty do
(
uv.selectEdges #{(allEdges as array)[1]}
uv.SelectElement()
elem01verts = uv.getSelectedEdges()
append uvIslands elem01verts --------设计方法是用一个数字 加入三个位 我一般都是用3 个数组 分别操作 这个办法很好。
allEdges = allEdges-elem01verts
)
)
else
(
messagebox "Select some UV islands!" title:"miauu Script Error!!!"
chkbtn_holdSelection.state = false
)
)
function RandomRotateInFaceSOL =
(
allFaces = uv.getSelectedFaces()
if not allFaces.isEmpty then
(
while not allFaces.isEmpty do
(
uv.selectFaces #{(allFaces as array)[1]}
uv.SelectElement()
elem01faces = uv.getSelectedFaces()
append uvIslands elem01faces
allFaces = allFaces-elem01faces
)
)
else
(
messagebox "Select some UV islands!" title:"miauu Script Error!!!"
chkbtn_holdSelection.state = false
)
)
on chkbtn_holdSelection changed theState do ---这个可以在123 层级进行活动
(
if theState then
(
uv = modpanel.getcurrentobject() ---确定当前选择的层级,这个很重要,在skin插件中就是用这个做判断。
if classof (uv) == Unwrap_UVW then
(
uvIslands = #()
case uv.getTVsubobjectMode() of --uv.getTVsubobjectMode() 判断uv使用的层级,通过这个确定使用不同的方法。
(
1: (RandomRotateInVertSOL(); subObjLevel = 1) --subObjLevel 这里是一个全局变量 这里要往外输出信息。
2: (RandomRotateInEdgeSOL(); subObjLevel = 2)
3: (RandomRotateInFaceSOL(); subObjLevel = 3)
)
)
else
(
--没有选择层级的用法,这个应该是很重要。
messagebox "Open the \"Edit UVWs\" window!" title:"miauu Script Error!!!"
chkbtn_holdSelection.state = false
)
)
else
(
uvIslands = #()
)
)
on btn_rotateRandom pressed do
(
case subObjLevel of ---subObjLevel 这个就是上面输出的单位里,这个就是决定是边的操作 线的操作 还是面的操作/
(
1:
(
for i=1 to uvIslands.count do ---我觉得这里设计不是很合理。
(
uv.selectVertices uvIslands[i] --其实想想也合理; 如果点边都有选择 那么这里就是我在那个层级选择哪一个了
uv.rotateSelectedCenter (random -3.14159 3.14159)
--<void><Unwrap_UVW>.moveSelected <point3>offset
--<void><Unwrap_UVW>.rotateSelected <float>angle <point3>axis
--上面都有他的语法。
-- 这样就到到了操作/
)
)
2:
(
for i=1 to uvIslands.count do
(
uv.selectEdges uvIslands[i]
uv.rotateSelectedCenter (random -3.14159 3.14159)
)
)
3:
(
for i=1 to uvIslands.count do
(
uv.selectFaces uvIslands[i]
uv.rotateSelectedCenter (random -3.14159 3.14159)
)
)
)
)
)
createdialog rol_UVRandomRotate 84 54 style:#(#style_titlebar, #style_sysmenu,#style_toolwindow)
)