1
\$\begingroup\$

I have four points in a 3D space, example:

(0,0,1)
(1,0,1)
(1,0,2)
(0,0,2)

Then I have a 2D position on that square plane:

x = 0.5
y = 0.5

I need to find out the 3D space point of that position in the plane. In this example it's easy: (0.5,0,1.5) Because Y is zero. But imagine that Y was not zero (and not all the same), that the plane is leaning in some direction. How would I calculate the point in that case?

I imagine this should be a pretty easy thing to solve, but I can't figure it out. Please answer in programming terms and not in straight math terms.

Update with image: The gray plane (made out of two triangles) are the real one actually existing. I create a non-existing plane on top of this, the ABCD corners are exactly the same, however it doesn't slope. What I need to do is project a pixel (blue one in example) from the non-existing plane to the existing plane. It will be in the exact same location, except that it has gained a Y value from the sloping plane.

http://i.imgur.com/mgvi1ZL.png

What I've been able to work out so far on my own is which one of the two triangles to use in the gray plane and the normal of triangle. I basically just need to figure out how I can project the pixel.

\$\endgroup\$
  • \$\begingroup\$ Is the plane composed of 4 triangles or 2? What points compose a triangle together? Do we know this at runtime? \$\endgroup\$ – Eejin Jul 3 '14 at 22:15
  • \$\begingroup\$ Each plane is composed of two triangles, in this example triangle A would be: (0,0,1) (1,0,2) (0,0,2) And triangle B: (0,0,1) (1,0,1) (1,0,2) We know this at runtime. Is that really needed to get the results? In my example (0.5,0.5) the point would touch both triangles (though I guess any one of them can be used in the calculation). \$\endgroup\$ – Pointman Jul 3 '14 at 22:31
  • \$\begingroup\$ Yes this is needed. I can't find a good image but try this. Draw 2 quads composed of 2 triangles each. One that is composed of triangles 0,1,2 and 1,3,2 and one composed of 0,2,3 and 0,1,3. You'll see that there is a line where the height is the average between 1,2 for quad one and 2,3 for quad 2. (top-left is 0, top-right is 1, bottom-left is 2 and bottom-right is 3) \$\endgroup\$ – Eejin Jul 3 '14 at 22:43
  • \$\begingroup\$ Sorry but I can't understand your answer. I also can't understand this one: math.stackexchange.com/questions/855840/find-point-in-3d-plane I got a calculation from a mathematician over there but I can't read it! Are you able to translate it into code? If not I totally understand. Sorry about not understanding your comment over here as well mate. \$\endgroup\$ – Pointman Jul 3 '14 at 23:11
  • \$\begingroup\$ For the point (0.5, 0.5) in the plane, are you setting the 'origin' of these coordinates as the plane's bottom-left corner? Will you always make this assumption? \$\endgroup\$ – Ryan Jul 3 '14 at 23:15
4
\$\begingroup\$

I'll assume that the A, B, C, D points really do lie on the same plane, i.e. that the two triangles form a single flat surface.

The first step is to calculate the plane equation for the plane. If you don't know what that is, don't worry too much about it. It's a set of four numbers that specify the plane's location and orientation in space. It can be found using any three of the four points on the plane:

float4 planeEqn;
planeEqn.xyz = cross(point1 - point0, point2 - point1);
planeEqn.w = -dot(planeEqn.xyz, point0);

Here, point0, point1, and point2 are any three of your original four points - it doesn't matter which ones, or in which order.

Now, you can solve the plane equation for y in terms of x and z. The plane equation in its native form looks like: planeEqn.x * x + planeEqn.y * y + planeEqn.z * z + planeEqn.w = 0 where (x, y, z) is any point, and the equation is true (equals zero) only for points on the plane. With a bit of rearrangement you can solve for y:

y = (-planeEqn.x * x - planeEqn.z * z - planeEqn.w) / planeEqn.y;

That gives you the function for the y-value of any point on the plane, given its x- and z-values.

\$\endgroup\$
0
\$\begingroup\$

Figured it out mostly thanks to http://gamedeveloperjourney.blogspot.com/2009/04/point-plane-collision-detection.html

Made me realize I had to verify the normal a bit closer, turns out my plane's grid was being rendered a little different than the actual coordinates for the verticles. No wonder this was so hard to get right! The pixel was projected correctly but rendered incorrectly.

Thanks for all the help guys, that blogspot entry can't take all the credits. You helped me too.

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.