zoukankan      html  css  js  c++  java
  • Blender绘制基本网格对象(转)

    网格定义

    网格是由点、线、面进行连接绘制的几何图形对象,Blender中将点、线、面的三维坐标信息储存在数组中。

    绘制网格

    为了使用Blender绘制,我们首先要引入Blender Python库bpy。

    import bpy
    

    要进行最简单的绘制,将创建三个空数组,分别命名为verts,edges,faces代表点、线、面。

    # 定义三个空列表分别用于存储点、线、面的几何信息
    verts = []
    edges = []
    faces = []
    

    这其中,verts用于储存点的三维空间坐标,现在我们来绘制一个五面体。

    # 定义各个点的坐标
    verts = [(2, 0, 4), (4, 1, 4), (4, 5, 4), (1, 4, 4), (3, 3, 7)]
    

    在定义了各个点的坐标之后,就可以开始定义线和面了。

    线和面非常类似,都是通过点的连接绘制而成,这里以面的定义举例,具体代码实现如下。

    # 确定面的绘制方法
    faces = [(0, 1, 2, 3), (0, 1, 4), (1, 2, 4), (2, 3, 4), (0, 3, 4)]
    

    这里需要注意的一点是,faces[]中的坐标实际上指的是点的连接顺序,faces[]中每一个元组代表一个面,而元组中的数代表verts[]中点的序数。

    比如,(0,1,2,3)表示verts[]中第1、2、3、4个点依次连接。注意,(0,1,2,3)与(3,2,1,0)虽然最终显示结果不会有什么区别,但是在数学上,其正向应当是相反的,而在Blender中,两种情况下,法线方向确实相反,这里后续可能会开展一点工作,不过现在不是重心。

    定义好点线面之后就可以创建网格对象并将之链接到当前工作空间中了,最后使用之前定义好的坐标数据将网格对象绘制并显示在工作空间中。

    # 首先新建一个窗口
    bpy.ops.scene.new(type='NEW')
    
    # 创建网格与对象
    fivemesh = bpy.data.meshes.new("fivemesh")
    fiveobj = bpy.data.objects.new("fivemeshes", fivemesh)
    
    # 将对象链接到当前场景集合中
    fiveobj.location = bpy.context.scene.cursor_location
    bpy.context.scene.collection.objects.link(fiveobj)
    
    # 根据python数据绘制实体
    fivemesh.from_pydata(verts, edges, faces)
    fivemesh.update(calc_edges=True)
    

    在Blender中运行代码显示结果如下。


     
     

    关于点、线、面数组是否使用时的绘制差异

    在上文的代码中,相信细心的人已经发现了,edges[]数组为空,我们只定义了verts[]与faces[]。

    verts[]无疑是不可或缺的,它是edges[]与faces[]的基础,那么,在faces[]为空或三者均不为空的时候,会有什么有趣结果出现呢?

    下面通过一个实例来具体说明。

    实现代码如下。

    import bpy
    
    # 分别设置线列表与面列表为空,显示结果不同,最后再与点线面三组属性设置均不为空的情况进行输出比较
    
    # 分别定义三组列表用于存储三种不同情况下几何体的空间信息
    verts_1 = [(0, 0, 0), (3, 0, 0), (3, 3, 0), (0, 3, 0), (1.5, 1.5, 3)]
    edges_1 = []
    faces_1 = [(0, 1, 4), (1, 2, 4), (2, 3, 4), (0, 3, 4)]
    
    verts_2 = [(5, 0, 0), (8, 0, 0), (8, 3, 0), (5, 3, 0), (6.5, 1.5, 3)]
    edges_2 = [(0, 1), (1, 2), (2, 3), (3, 0), (0, 4), (1, 4), (2, 4), (3, 4)]
    faces_2 = []
    
    verts_3 = [(0, 5, 0), (3, 5, 0), (3, 8, 0), (0, 8, 0), (1.5, 6.5, 3)]
    edges_3 = [(0, 1), (1, 2), (2, 3), (3, 0), (0, 4), (1, 4), (2, 4), (3, 4)]
    faces_3 = [(0, 1, 4), (1, 2, 4), (2, 3, 4), (0, 3, 4)]
    
    # 开始图形的绘制
    # 首先打开一个新图层
    bpy.ops.scene.new(type="NEW")
    
    # 分别创建三个网格和对象
    mesh_1 = bpy.data.meshes.new("mesh_1")
    obj_1 = bpy.data.objects.new("mesh_1", mesh_1)
    mesh_2 = bpy.data.meshes.new("mesh_2")
    obj_2 = bpy.data.objects.new("mesh_2", mesh_2)
    mesh_3 = bpy.data.meshes.new("mesh_3")
    obj_3 = bpy.data.objects.new("mesh_3", mesh_3)
    
    # 将这三个对象链接到当前场景集合中
    obj_1.location = bpy.context.scene.cursor_location
    bpy.context.scene.collection.objects.link(obj_1)
    obj_2.location = bpy.context.scene.cursor_location
    bpy.context.scene.collection.objects.link(obj_2)
    obj_3.location = bpy.context.scene.cursor_location
    bpy.context.scene.collection.objects.link(obj_3)
    
    # 根据python数据分别绘制实体
    mesh_1.from_pydata(verts_1, edges_1, faces_1)
    mesh_2.from_pydata(verts_2, edges_2, faces_2)
    mesh_3.from_pydata(verts_3, edges_3, faces_3)
    
    # 设置法线可见
    bpy.context.view_layer.objects.active = obj_1
    bpy.ops.object.mode_set(mode='EDIT')
    for area in bpy.context.screen.areas:
        if area.type == 'VIEW_3D':
            bpy.context.space_data.overlay.show_face_normals = True
            bpy.context.space_data.overlay.normals_length = 2
    
    mesh_1.update(calc_edges=True)
    mesh_2.update(calc_edges=True)
    mesh_3.update(calc_edges=True)
    

    输出结果如下。


     
     

    可以看到,在faces[]为空的时候,绘制的是一个线框,而在三者均不为空时,在图形表面出现了线框。

  • 相关阅读:
    jython resources
    Installing a Library of Jython ScriptsPart of the WebSphere Application Server v7.x Administration Series Series
    jython好资料
    ulipad install on 64bit win7 has issue
    an oracle article in high level to descibe how to archtichre operator JAVA relevet project
    table的宽度,单元格内换行问题
    Linux常用命令大全
    dedecms系统后台登陆提示用户名密码不存在
    登录织梦后台提示用户名不存在的解决方法介绍
    Shell常用命令整理
  • 原文地址:https://www.cnblogs.com/liaocheng/p/15603818.html
Copyright © 2011-2022 走看看