Advertisement

Height of a 3D triangle

Started by February 20, 2013 04:42 AM
1 comment, last by el junk 12 years ago

Let's say I have two triangles in a 3D space

The triangles are, of course, made from 3 coordinates (each coordinate an X/Y/Z set)

First Triangle:

X1 = 0, Y1 = 0, Z1 = Dynamic

X2 = 1, Y2 = 0, Z2 = Dynamic

X3 = 1, Y3 = 1, Z3 = Dynamic

Second Triangle:

X1 = 0, Y1 = 0, Z1 = Dynamic

X2 = 1, Y2 = 1, Z2 = Dynamic

X3 = 1, Y3 = 0, Z3 = Dynamic

... So, basically, a square that's cut through the middle (and bends on that cut)

Each Z value for each is known, but varies from instance to instance. And they vary independently.

If I have a position (Say, X=0.13,Y=0.73)

How would I calculcate what the Z of the triangle will be at that position?

(I'm hoping for an equation or pseudocode that will calculate the value without using raytracing or any expensive functions like that)

If the two triangles always lie on the same plane then you can calculate the plane the triangles lay on.

The equation for a plane is
Ax + By + Cz + D = 0;
<A, B, C> is the normal of the plane and D is the closest distance of the plane to the origin divided by the length of the normal. To calculate a plane from a triangle.

// the A, B, and C of the plane
normal = cross(P2 - P1, P3 - P1)
d = -dot(P1, normal) // you can dot the normal with any of the points in the triangle, it will yield the same d

where cross() is the cross product, dot() is the product, and Pn is a point on the triangle

Then use the equation of the plane to solve for x, y, or z when you have the other two. For example, to solve for z
Ax + By + Cz + D = 0
Cz = -Ax - By - D
z = -(Ax + By + D) / C
This will find the point on the same plane the point can lie on the outside of the triangles, so you will have to make sure you point lies inside the triangle. If you need help with that I can post a method for that, I just don't want to crowd up this post if you already have a way to do that.

This actually is the basics of how a ray tracer works. Casting an individual ray is actually quite fast. Ray tracing entire images however is costly because there are many rays being cast per pixel. Some rays are used to calculate shadows, others reflections, and other such things and the scenes are usually fairly complex. You should be able to cast dozens of rays in a simpler scene and still maintain a responsive frame rate. So unless you find your game isn't running fast enough and you have identified your "ray casting" as the bottleneck, I wouldn't spend much time making sure it is fast.
My current game project Platform RPG
Advertisement

Two edges of a given triangle span the plane containing that triangle. So you could try looking at what you want to calculate as a linear combination of these basis vectors and solve it that way. Because of the particular X, Y components of your triangle vertices, this might actually be cheap: b(1,1) - b(1,0) + a(1,0) = (a,b).

Another way is to compute the plane equation: Ax + By + Cz = D and then solve for z.

The (X, Y) you gave is in either of the spanned planes, but not on either triangle, since it has a large Y component. I'm not sure if that was intentional.

This topic is closed to new replies.

Advertisement