[Closed] cant get my head around pickPoint
i am using pickpoint to pick a vertice but the x,y,z values it returns are different to what the coordinate system shows and is dependant on the viewport its picked from… i need to do some calculations on vertex positions and need the pickpoint to return the actual coordinate —
Could it be something to do with the fact that pickPoint always returns coordinates in world-space?
is there a way to change that so it doesnt always return world space coordinates… or can I change the coordinate from world space to something else…
You can switch from global positions to parent-based positions using this:
localTM = objectTM * inverse (parentTM)
here is the script I am trying to modify (EdgeStraighten from scriptspot) – but it doesnt work properly i believe so i dont understand how to fix it in the first place…
all i want is from perspective view if i select few verts and then use pickpoint to select another two end verts… all the selected verts should align properly in x,y and z respective to the verts selected by pickpoint… Any help would be greatly appreciated
macroScript VEPerfectCurve
ButtonText:"V/E Perfect Curve"
Category:"Frontier Tools"
icon:#("Splines",1)
Tooltip:"Make Vertices / Edges Perfect Curve"
(
function calc_pointpos pos points=
(
p1 = points[1]
p3 = points[2]
p2 = pos
k = (distance p1 p3)
a = (distance p1 p2)
b = (distance p2 p3)
m = (a^2-b^2+k^2)/(k+k)
n = k-m
new = [0,0,0]
new.x = (n*p1.x+m*p3.x)/(n+m)
new.y = (n*p1.y+m*p3.y)/(n+m)
new.z = (n*p1.z+m*p3.z)/(n+m)
return new
)
function pick_points =
(
--local savesnap=snapMode.active
--snapMode.active=true
points_arry=#()
p1 = undefined
p3 = undefined
p1 = pickPoint snap:#3d
if classof p1 == point3 then
p3 = pickPoint snap:#3d rubberBand:p1
points_arry = #(p1,p3)
--snapMode.active=false
return points_arry
)
function edges2vertex edges_arry polyObj =
(
vert_arry=#()
edges_arry = edges_arry as array
for k = 1 to edges_arry.count do
(
v = polyOp.getEdgeVerts polyObj edges_arry[k]
append vert_arry v[1]
append vert_arry v[2]
)
vert_arry = vert_arry as bitarray
vert_arry = vert_arry as array
return vert_arry
)
function get_vertex points polyObj =
(
vert_arry=#()
sl = getSelectionLevel polyObj
vert_arry = case sl of
(
#vertex:polyop.getVertSelection polyObj
#edge:edges2vertex (polyop.getEdgeSelection polyObj) polyObj
default:#()
)
vert_arry = vert_arry as array
return vert_arry
)
function set_vertex points sel_arry obj polyObj=
(
undo on
(
for k = 1 to sel_arry.count do
(
pos = polyOp.getVert polyObj sel_arry[k] node:obj
print (pos.x as string + " - " + pos.y as string + " - " + pos.z as string)
print "_______________________________"
newpos = calc_pointpos pos points
polyOp.setVert polyObj sel_arry[k] newpos node:obj
)
) --undo
)
if selection.count == 1 then
(
-- Gets the type of object i.e. Editable Poly / Mesh.
polyObj = $.baseobject
if classof polyObj == Editable_Poly then
(
setWaitCursor()
with redraw off
obj=$
if (getSelectionLevel polyObj) == #vertex or (getSelectionLevel polyObj) == #edge then
(
-- Check if the Edge Constraints are on - Returns 0 if its
cur_const = getProperty polyobj #constrainType
setProperty polyobj #constrainType 0
points = pick_points()
if classof points[1] == point3 and classof points[2] == point3 do
(
verts = get_vertex points polyObj
if verts.count != 0 then
(
set_vertex points verts obj polyObj
-- bug?!
-- max move
)
else
(
messagebox "Select Some Vertex Or Edges" title:"Straighten edge"
)
)
setArrowCursor()
setProperty polyobj #constrainType cur_const
)
else
(
messagebox "Activate Vertex/Edge sub-object level" title:"Straighten edge"
)
)
else
(
messagebox "Select Editable Poly Object" title:"Straighten edge"
)
)
else
(
messagebox "Select Editable Poly Object" title:"Straighten edge"
)
)
I can’t tell you offhand why it’s not working as expected. But the idea of picking the end points manually seems unnecessary. You should be able to pick the end verts in a row of selected verts or edges through script. Just do a check to find the two verts that only have one of the other selected verts in common, if that makes sense.
Hey Abhishek,
Just a quickie, but you could simplify your points calculation in this bit:
(n * p1 + m * p3) / (n + m)
EDIT: Actually just checked and it runs in a quarter of the time. Nice
Also, miss out the “return new” statement; just end with that calculation (the function will run faster)
Cheers,
Dave