zoukankan      html  css  js  c++  java
  • Blender & Python 两点坐标建立圆柱

    从Blender建立一个圆柱体可以知道,需要的参数为 半径,圆柱长,中点坐标。

    当我们只知道圆柱两端面中心的坐标能否建立圆柱呢?

    方法一,通过两点坐标计算中心坐标,和欧拉角。

     1 def cylinder_between(x1, y1, z1, x2, y2, z2, r):
     2 
     3   dx = x2 - x1
     4   dy = y2 - y1
     5   dz = z2 - z1    
     6   dist = math.sqrt(dx**2 + dy**2 + dz**2)
     7 
     8   bpy.ops.mesh.primitive_cylinder_add(
     9       radius = r, 
    10       depth = dist,
    11       location = (dx/2 + x1, dy/2 + y1, dz/2 + z1)   
    12   ) 
    13 
    14   phi = math.atan2(dy, dx) 
    15   theta = math.acos(dz/dist) 
    16 
    17   bpy.context.object.rotation_euler[1] = theta 
    18   bpy.context.object.rotation_euler[2] = phi 

    上面代码的缺点之一是,运动中的圆柱,需要求不同时间之间变换的欧拉角来更新。

    方法二,利用nurbs曲线建立圆柱

    import bpy
    
    bpy.ops.curve.primitive_bezier_curve_add()
    obj = bpy.context.object
    obj.data.dimensions = '3D'
    obj.data.fill_mode = 'FULL'
    obj.data.bevel_depth = 0.1
    obj.data.bevel_resolution = 4
    # set first point to centre of sphere1
    obj.data.splines[0].bezier_points[0].co = (-1,-1,0)
    obj.data.splines[0].bezier_points[0].handle_left_type = 'VECTOR'
    # set second point to centre of sphere2
    obj.data.splines[0].bezier_points[1].co = (1,1,0)
    obj.data.splines[0].bezier_points[1].handle_left_type = 'VECTOR'

    这样可以在制作动画时,每次只要更新这段代码即可 obj.data.splines[0].bezier_points[1].co = (1,1,0) 

    但是缺点也很明显,如下图,两端没有封死,其实就是个管道

  • 相关阅读:
    apiAutoTest:基于mitmproxy实现接口录制
    FastAPI + Vue 前后端分离 接口自动化测试工具 apiAutoTestWeb
    FastAPI项目实战:"异步"接口测试"平台"
    apiAutoTest:自动化测试用例中调用自定义函数的实现
    测试笔记01-Git
    C++:常量
    C++: 变量类型
    C++:数据类型
    C++:第一个c++程序
    mitrproxy抓包微信小程序
  • 原文地址:https://www.cnblogs.com/dalanjing/p/13090708.html
Copyright © 2011-2022 走看看