Face pointing towards the camera?
-
I'm making a tool where I use the PickHelper to get the best face picked. But I'd like to know if the user clicks the front or back side of the face.
Any clues to how to determine that?
-
Could you get the face normal and compare it to the camera direction?
-
Was thinking it'd be something like that. Comparing the two Vector3d objects, but right now I can't wrap my head around how to compare them...
-
If the angle between the vector [picked_point_to_eye] and the picked_face_normal is > 90.degrees then you are looking at the back ? If it is 90.degrees toss a coin ???
-
I'm wondering is the sign of the dot product between the camera vector and the face's global vector will work...
will have to try tomorrow. -
@thomthom said:
I'm wondering is the sign of the dot product between the camera vector and the face's global vector will work...
will have to try tomorrow.This appear to work. But I'm not generating the global vector correctly. I thought I could take the face vector and transform! it with each of the group's transformation...
-
FWIW LightUp does this:
pickface.normal.transform(@xform).dot(view.pickray(x, y)[1]) > 0
-
Won't
view.pickray(x, y)[1]
be a vector parallel tocamera.direction
?@xform
is the total transformation?given the path to a face, I initially started with the out most transformation, but I should instead go the other way?
then you have the issue of SU changing the co-ordinates if you open a group/component. If I'm inside an open component and pick a face outside the scope - then what?
-
Does
PickHelper.transformation_at
return the total transformation for that entity, including it's parents? -
@thomthom said:
Does
PickHelper.transformation_at
return the total transformation for that entity, including it's parents?Yes.
Seems to be working fine now.
-
Sounds complicated. How about:
` center = face.bounds.center
edge1 = camera.eye to center
edge2 = camera.eye to (center + face.normal)edge1 longerThan edge2 ? outside : inside`
This fails in the special case when camera's line-of-sight is nearly parallel to face's plane.
-
Heh, I like that method Martin. I think the logic is sound. Should be simple to implement also, which is always welcome!
Chris
-
@martinrinehart said:
Sounds complicated. How about:
` center = face.bounds.center
edge1 = camera.eye to center
edge2 = camera.eye to (center + face.normal)edge1 longerThan edge2 ? outside : inside`
This fails in the special case when camera's line-of-sight is nearly parallel to face's plane.
That will tell if the face is pointing frontside or backside towards the camera?
This seems to work without any special cases.
t = ph.transformation_at(index) n = picked.normal.transform(t).normalize c = Sketchup.active_model.active_view.camera.direction m = (c % n > 0) ? e.back_material ; e.material
-
face = Sketchup.active_model.selection[0] cam = Sketchup.active_model.active_view.camera.eye e1 = cam.vector_to(face.bounds.center) e2 = e1 + (face.normal) (e1.length > e2.length) ? (puts "front") : (puts "back")
That is the method Martin outlined. I don't know about the transformation. I guess you would have to figure that in on your own. Is it because the InpointPoint returns the un-transformed normal for a face?
Chris
-
InputPoint only returns entities. So when I pick a face I only get the normal via face.normal, which is the local normal.
But
PickHelper.transformation_at(index)
returns the complete global transformation for the entity.only thing is - I need to test what happends when I'm inside an open group/component, but pick from something outside the current context. (if that's at all possible)
-
Yikes, good luck. This seems to go back to the complaint that SU does not like to traverse through the heirarchy backwards like this.
-
Turns out - there isn't a problem. The PickHelper doesn't pick anything but what's in the currently open context.
-
@martinrinehart said:
Sounds complicated. How about:
` center = face.bounds.center
edge1 = camera.eye to center
edge2 = camera.eye to (center + face.normal)edge1 longerThan edge2 ? outside : inside`
This fails in the special case when camera's line-of-sight is nearly parallel to face's plane.
But thats much more work than a dot product. Your turning an orientation problem into something its not.
-
Interesting Thom. So how do people make tools that select entities outside the current editing level? Can you use the inputpoint class to succesfully return entities outside the current editing level? This is something I really never work with, in case you couldn't tell!
Chris
-
I'm not sure if you can. I think that when the user digs into groups/components it narrows the available scope.
Though this is not something I've explored, as I've never needed to do this.
Advertisement