intersection between a plane and a line


Does somebody know the formula to calculate the intersection between a plane and a line?

The plane is defined by its normal and some point of this plane.
The line is defined by a vector and some point of this line.


Thanks in advance.


Hello Pixel!

This is actually a little harder than it seems, but not impossible ;>

from mathworld:

but, luckily for us Max comes with all sorts of funky things for finding this kind of stuff out so why do we need to get too complicated!! :

p=plane pos:planepoint dir:planenormal -- create a plane for our intersection
converttomesh p	 -- turn it into a mesh for our intersectray
r=ray linepoint linevector	-- cast the ray
i=(intersectray p r)	 -- find the intersection
if i!=undefined then h=point pos:i.pos dir:i.dir -- if there is an intersection, place a marker!
-- make a spline between our two points
spl=splineshape pos:[0,0,0]
s=addnewspline spl
addknot spl s #corner #line linePoint
addknot spl s #corner #line (linePoint+lineVector)
updateshape spl

This is only going to work in certain circumstances, for example the lpane is ony so large! so maybe maths is a better way to go after all:

n=[0,0,1] -- planeNormal
c=[1,2,3] -- planePoint
v=[0,0,-1] -- lineVector
a=[2,4,9] -- linePoint
b=a+v	-- turn our line pos and vector into a second point b
-- t is the missing part of our equation, and is calculated by dividing the dot product of
-- the plane point and the start point, and the end point and the start point.
t=(dot (c-a) n) / (dot (b-a) n)
-- now we can calculate the intersection point.
-- the intersection point!
p=point pos:r
-- make a plane and a shape to test visually:
-- the plane:
p=plane pos:c dir:n
-- the vector:
spl=splineshape pos:[0,0,0]
s=addnewspline spl
addknot spl s #corner #line a
addknot spl s #corner #line b
updateshape spl

Hope this helps!



or as a function! :>

-- Find the intersection of a vector on a plane
-- version 1.0
-- [](
-- last updated 27/10/05
-- copyright 2005
fn planelineintersect c n a v= -- planelineintersect <plane_point> <plane_normal> <line_point> <line_vector>
r=a+(dot (c-a) n) / (dot (b-a) n)*(b-a)
-- for example!
p=plane pos:[1,2,3] dir:[0,0,1]
r=planelineintersect p.pos p.dir [2,4,9] [0,0,-1]
pnt=point pos:r


Fantastic, that’s exactly the answer I was hoping.
And your comments help me to understand how that does work.

Many thanks again !


no problem < :


Hello Joshua

Is there a mean to discover if the vector is parallel to the plane directly in the mathematical function ?
The function could return the value 0 if there is no collision and -1 if there is an infinity of solutions.

Is it possible without calculating indefinite or infinite values?


Oh. I just found the solution: It’s linked to the 2 dot values.
If the second dot is equal at zero then the vector is parallel.
If the first dot is also equal at zero then the vecteur is included in the plane.

Et voilà :wink:


Yes, and a good idea!

I never tested it that far, but yes, true. I came across a problem in the function, that I think is caused by the rounding problem in Max. I seem to remebmer someone discussing on the discreet board a while back. Took me a little while to figure it out, I thought It might be calculating the DOT product with non normailzed vectors but I’m pretty sure everything is normalized.
I’ve incorporated a tolerance that says that the result of the DOT can be between -0.0000000754 and 0.0000000754 which makes it accurate to less than .01 degrees
If the error is somewhere else then please someone let me know (vectors smectors!).[u][/u]

let me know how it goes prettyPixel or if you found your own solution!


For me your function is perfect now.

I will use it soon in a real use. Then I could say you more about it…

Thank you very much Joshua.


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.