Jump to content

  • Log In with Google      Sign In   
  • Create Account

Interested in a FREE copy of HTML5 game maker Construct 2?

We'll be giving away three Personal Edition licences in next Tuesday's GDNet Direct email newsletter!

Sign up from the right-hand sidebar on our homepage and read Tuesday's newsletter for details!


Height of a 3D triangle


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
2 replies to this topic

#1 mcmonkey   Members   -  Reputation: 113

Like
0Likes
Like

Posted 19 February 2013 - 10:42 PM

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)


Edited by mcmonkey, 20 February 2013 - 06:07 PM.


Sponsor:

#2 HappyCoder   Members   -  Reputation: 2816

Like
0Likes
Like

Posted 19 February 2013 - 11:37 PM

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.

Edited by HappyCoder, 19 February 2013 - 11:39 PM.


#3 deekr   Members   -  Reputation: 191

Like
0Likes
Like

Posted 19 February 2013 - 11:39 PM

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. 






Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS