Blender Normalenvektor Ebene

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
StuEv
User
Beiträge: 4
Registriert: Donnerstag 16. September 2021, 13:08

Hallo zusammen,

ich habe ein kleines Problem:

ich möchte den normalenvektor einer Ebene ermittel nachdem ich die Ebene gedreht habe.

leider lässt sich nur der Normalenvektor vor der verdrehung ermitteln welcher standardmäßig in Richtung Z-Achse zeigt <Vector (0.0000, 0.0000, 1.0000)>

Sinn de Skripts soll es sein unabhängis von der Verdrehung, die Distanz eines Punktes von einer Ebene zu bestimmen.

Bisher sieht mein code so aus:
import mathutils
import bpy
from math import radians

bpy.ops.mesh.primitive_plane_add(enter_editmode=False, align=‘WORLD’, location=(0, 0, 0), scale=(1, 1, 1))

bpy.ops.transform.rotate(value=radians(90), orient_axis=‘X’)

obj = bpy.context.active_object

p = obj.data.polygons[0]

norm_vec = p.normal

def main():

Plane_point = mathutils.Vector((0.0, 0.0, 0.0))

point = mathutils.Vector((0.0, 0.0, 2.0))

distance = mathutils.geometry.distance_point_to_plane(point, Plane_point, norm_vec)

print(norm_vec)
return distance

if name == ‘main’:
print(main())
Danke
StuEv
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Warum drehst du den Normalenvektor nicht auch mit der gleichen Transformation?
StuEv
User
Beiträge: 4
Registriert: Donnerstag 16. September 2021, 13:08

Du meinst direkt in: bpy.ops.mesh.primitive_plane_add(enter_editmode=False, align=‘WORLD’, location=(0, 0, 0), scale=(1, 1, 1)) ??

das geht leider nicht... es sind nur die Paramter in der Klammer möglich, deshalb im nachhinein die Drehung
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

norm_vec kann doch auch einfach um 90 grad um die X Achse gedreht werden.
StuEv
User
Beiträge: 4
Registriert: Donnerstag 16. September 2021, 13:08

Habe es nun so probiert aber es kommt immer ein Fehler:

.....

bpy.ops.mesh.primitive_plane_add(enter_editmode=False, align='WORLD', location=(0, 0, 0), rotation=(0.0, 0.0, 0.0), scale=(1, 1, 1))

rot = 90

bpy.ops.transform.rotate(value=radians(rot), orient_axis='X')

obj = bpy.context.active_object

p = obj.data.polygons[0]

norm_vec = p.normal

eul = mathutils.Euler((0.0, radians(rot), 0.0), 'XYZ')

norm_vec.rotate(eul)
StuEv
User
Beiträge: 4
Registriert: Donnerstag 16. September 2021, 13:08

bpy.ops.mesh.primitive_plane_add(enter_editmode=False, align='WORLD', location=(0, 0, 0), rotation=(radians(90), 0.0, 0.0), scale=(1, 1, 1))


obj = bpy.context.active_object

p = obj.data.polygons[0]

norm_vec = p.normal

norm_vec = mathutils.Vector(norm_vec)

norm_vec.rotate(mathutils.Euler((radians(90), 0, 0), 'XYZ'))

Habe es hinbekommen, aber der Vektor hat nun rundungsfehler. Abstand zum Punkt sollte 0 sein da der Punkt nun auf der Ebene liegt und raus kommt:

<Vector (0.0000, -1.0000, -0.0000)>
-8.742277657347586e-08
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist halt so. Ein 10millionstel Meter ist recht nah dran. Bei sowas Muss man dann mit einem epsilon für tolerierbare Abstände arbeiten.
Antworten