Thanks again for everything that you had done in this time.
Today my question is: how can i recognize if a point (it doesn’t matter if it’s really an empty or not) is inside or outside a mesh using a python script??
the mesh that i want to use is not a simple cube or cone but it could be a sweep nurbs or a loft nurbs or something else that have not a regular geometry.
Thanks again !
bpy.ops.mesh.normals_make_consistent, so you get all normals of the faces showing to the outside.
Now finding a face which is closest to that point (i have no idea how to determine close in this context).
Take the normal of this face, the direction from an arbitrary point of the face to your point and make a “mathutil.dotVecs” of those two vectors.
If the result is negativ, it means, the normal of the face is directing more than 90° away from the vector to your point, than your point is inside.
Hi flashnfantasy !!!
Thank you for the answer but there is a little problem in your reasoning:
if i have a cube like that i can’t apply your method i suppose…!
the problem was the way you asked the question albiz1985. you have no ‘mesh’ , so "is inside or outside a mesh " is not what you are asking, if this is your image
the answer will depend on the geometry, if it’s simple geometry like cubes, you will probably find an answer fast (at least a nice approximation). fun to figure out, less fun to explain
Hi zeffii !!
Maybe there is a misunderstood, i know that my explanations are very bad…
My focus is to know if 2 MESH (with faces and edges) are intersected each other;
the post of flashnfantasy is good and wonderful so my question is: “is there another method that can be used also when 2 of that cubes are intersected??”
the answer will depend on the geometry, if it’s simple geometry like cubes, you will probably find an answer fast (at least a nice approximation)
Thank you very much
Hi flashnfantasy !!!
Are you sure about the code???
When i write it an error message appear: “Operator bpy.ops.mesh.normals_make_consistent.poll() failed, context is incorrect”
I know that it’s well writed but it doesn’t work and i don’t know why…
I came up with this a while ago (with help).
def pointInsideMesh(point,ob): # provided by aothms. # axes = [ mathutils.Vector((1,0,0)), mathutils.Vector((0,1,0)), mathutils.Vector((0,0,1)) ] # @Abel, ok just one then axes = [ mathutils.Vector((1,0,0)) ] outside = False for axis in axes: # @Atom you're right, ray_cast is in object_space # http://www.blender.org/documentation/250PythonDoc/bpy.types.Object.html#bpy.types.Object.ray_cast mat = mathutils.Matrix(ob.matrix_world).invert() orig = mat*point count = 0 while True: location,normal,index = ob.ray_cast(orig,orig+axis*10000.0) if index == -1: break count += 1 orig = location + axis*0.00001 if count%2 == 0: outside = True break return not outside
Hi Atom !!!
Thanks for the answer !!!
I just write this code:
import bpy import mathutils from mathutils import Vector def Dist(V): P=Vector((5,4,2)) (V - P).length def Choice(A): B= for i in range(len(A)): B.append(Dist(A[i])) M=min(B) I=B.index(M) return I def run(): D= cu=bpy.context.object me=bpy.data.meshes[cu.name] N=me.faces for i in range(len(N)): D.append(N[i].center) V=Choice(D) #N[V] is the nearest face to P a=(N[V].normal).dot((N[V].center-P)) if (a<0): print("inside") else: if(a==0): print("face") else: print("outside") def Start(): run()
Now i’m not sure about the value of “a” in run function.
Edit: Hi Atom! your script seems not working in orig=mat*point… Matrix and vector are imported but …