I write a simple script.
Create two Cube and change vertice[0] a little ~
Then, match their Location and Normals direction.
But , There’s some sticky in Normal-match-part.
I’ve try many many times.
So. I really need your help.
Thanks for your Help~
import bpy
import random
from math import degrees
def parallel(vct, p):
"""
vct : vector line
p : points
return : parallel vector with vct
"""
#tmp var in caculate
pt1 = p.copy()
for i in pt1:
i+=1
#new point in vct line
pt1 = pt1.project(vct)
pt2 = p.project(vct)
#offset
offset = pt2-p
pp = pt1-offset
#final
newVct = pp
print("
new point:%s" % (pp))
if newVct[0]==newVct[1]==newVct[2]==0:
print('error vector.zero')
return newVct
def MatchPoint0(context, ob1, ob2):
"""
static = ob1
dynamic = ob2
"""
vt1 = ob1.data.vertices[0]
vt2 = ob2.data.vertices[0]
print('Check location ::%s' % (vt1.co))
#location match
m1 = ob1.matrix_world.copy()
m2 = ob2.matrix_world.copy()
loc1 = m1 * vt1.co
loc2 = m2 * vt2.co
bpy.ops.object.select_all(action='DESELECT')
context.scene.objects.active = ob2
ob2.select = True
bpy.ops.transform.translate(value=loc1 - loc2)
context.scene.cursor_location = loc1
bpy.ops.object.origin_set(type='ORIGIN_CURSOR', center='MEDIAN')
#So, We can keep on caculate rotation match
#Caculate again cuz of ob2 is moved
m2 = ob2.matrix_world.copy()
n1 = m1 * vt1.normal.copy().normalized()
n2 = m2 * vt2.normal.copy().normalized()
angle = n1.angle(n2)
print(degrees(angle))
dot = n1.dot(n2)
print(dot)
###
### I'm Confusing in this section too much time, How to match there two Normals? Please ~
###
if dot>0:
angle *= -1
cross = n1.cross(n2)
cross = parallel(cross, loc1)
bpy.ops.transform.rotate(value=angle, axis=cross)
return
def PrepareMesh(ob):
"""init"""
bpy.ops.object.editmode_toggle()
bpy.ops.mesh.select_all(action = 'DESELECT')
bpy.ops.object.editmode_toggle()
vt0 = ob.data.vertices[0]
vt0.select = True
for i in range(len(vt0.co)):
vt0.co[i] += random.uniform(0.1, 1)
ob.data.update()
ob.data.show_normal_vertex = True
print('ob Name: %s -vt0- ::
location: %s
normal: %s
' % (ob.name, vt0.co, vt0.normal))
return
def main(context):
print('
--->>>')
# Creating and Preparing
bpy.ops.mesh.primitive_cube_add(view_align=True, location=(0, 0, 0), rotation=(10, 20, 30))
ob1 = context.active_object
PrepareMesh(ob1)
ob2 = bpy.ops.mesh.primitive_cube_add(view_align=True, location=(3, 0.5, 0), rotation=(40, 50, 60))
ob2 = context.active_object
PrepareMesh(ob2)
# Main working
# static = ob1
# dynamic = ob2
MatchPoint0(context, ob1, ob2)
class SimpleOperator(bpy.types.Operator):
"""Tooltip"""
bl_idname = "object.simple_operator"
bl_label = "Simple Object Operator"
def execute(self, context):
main(context)
return {'FINISHED'}
def register():
bpy.utils.register_class(SimpleOperator)
def unregister():
bpy.utils.unregister_class(SimpleOperator)
if __name__ == "__main__":
register()
# test call
bpy.ops.object.simple_operator()