PDA

View Full Version : cant get my head around pickPoint


abyjoe
05-07-2008, 01:37 AM
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 ---

erilaz
05-07-2008, 01:57 AM
Could it be something to do with the fact that pickPoint always returns coordinates in world-space?

abyjoe
05-07-2008, 11:58 AM
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....

IkerCLoN
05-07-2008, 01:53 PM
You can switch from global positions to parent-based positions using this:

localTM = objectTM * inverse (parentTM)

abyjoe
05-07-2008, 08:44 PM
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"
)
)

JHaywood
05-08-2008, 09:37 PM
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.

abyjoe
05-09-2008, 09:22 AM
ok great... I will have a look into that... thanks for pointing out

davestewart
05-09-2008, 10:22 AM
Hey Abhishek,
Just a quickie, but you could simplify your points calculation in this bit:



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


(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

CGTalk Moderation
05-09-2008, 10:22 AM
This thread has been automatically closed as it remained inactive for 12 months. If you wish to continue the discussion, please create a new thread in the appropriate forum.