`
schi
  • 浏览: 203883 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

sierpinski triangle 2d in maya(with python API 2.0)

阅读更多




在国庆前我刚好完成手上的工作,有两三天的空闲,于是就去研究了一下分形就当是练习算法,谢尔宾斯基三角形就是其中一个,关于它可以看http://en.wikipedia.org/wiki/Sierpinski_triangle
这里我们使用掏(去)心法和python API 2.0来实现谢尔宾斯基三角形2d(还存在3d的)版本.
算法很简单



  1. 创建或得到一个三角形,等腰三角形最好,但不是等腰也行,只不过看起来有点别扭而已
  2. 然后根据每条边的中点进行分割,可以得到4个三角形,把中间的三角形删除
  3. 把剩下的n个三角形重复第二步的分割和删除
  4. 不停的重复第二和第三步

import maya.api.OpenMaya as om
from maya import cmds
def sierpinskiTriangle_2d(loop=1):
    triPoints = (om.MPoint(0, 0, -10), om.MPoint(-10, 0, 10), om.MPoint(10, 0, 10))
    uValue = (0, 0.5, 1)
    vValue = (0, 1, 0)
    meshFn = om.MFnMesh()
    meshFn.create(triPoints, (3,), (0, 1, 2), uValue, vValue)
    meshFn.assignUVs((3,), (0, 1, 2))

    name = meshFn.name()
    for j in range(loop):
        for i in range(meshFn.numPolygons):
            cmds.select("%s.f[%d]" % (name, i), r=1)
            edges = cmds.polyInfo(fe=1)[0].split()[-3:]
            meshFn.split(((meshFn.kOnEdge, int(edges[2]), 0.5), (meshFn.kOnEdge, int(edges[1]), 0.5), (meshFn.kOnEdge, int(edges[0]), 0.5), (meshFn.kOnEdge, int(edges[2]), 0.5)))
            meshFn.deleteFace(meshFn.numPolygons - 1)
            meshFn.updateSurface()
    cmds.select(name, r=1)
    cmds.hyperShade(a="lambert1")
    cmds.select(cl=1)

创建一个三角形
triPoints = (om.MPont(0, 0, -10), om.MPont(10, 0, 10), om.MPont(10, 0, 10))
uValue = (0, 0.5, 1)
vValue = (0, 1, 0)
meshFn = om.MFnMesh()
meshFn.create(triPoints, (3,), (0, 1, 2), uValue, vValue)
meshFn.assignUVs((3,), (0, 1, 2))

使用
om.MFnMesh.create()

来创建多边形,你需要提供多边形的所有顶点坐标,就是一个om.MPoint()或om.MFloatPoint()的列表我们的三角形只有3个顶点.
triPoints = (om.MPont(0, 0, -10), om.MPont(10, 0, 10), om.MPont(10, 0, 10))

然后是每个面有多少个顶点数;
接着是每个面应该由哪些顶点而构成;
uv信息是可以不提供的,不提供的话创建出来的多边形就是没uv的,uValue是一个基于uvId(uv顶点)排列的uv坐标数组,vValue也一样.我们只有3个uv顶点,我希望它们的坐标是(0, 0), (0.5, 1), (1, 0).
还有一个parent参数,也是一个可选参数,如果你提供了,那创建出来的多边形就会以你提供的节点来做父节点,不提供则创建一个transform节点来做父节点.我们这里不需要,所以忽略.
所有信息都提供了就可以创建多边形了
meshFn = om.MFnMesh()
meshFn.create(triPoints, (3,), (0, 1, 2), uValue, vValue)

三角形是创建了,但你会发现它是没有uv的,我们明明就提供了uv信息;其实是这样的om.MFnMesh.create()只是把你传递的uv信息保存而已,并不会真正的去创建uv map,为了让我们传递的uv信息被运用到模型上我们需要调用
meshFn.assignUVs((3,), (0, 1, 2))

第一个参数,uvCounts,是一个列表,每个uv面的uv顶点的数量;
uvIds,也是一个列表,是每个uv面的对应的uvId.
我们的三角形只有一个面,3个顶点,所以是(3,), (0, 1, 2)
到这里就进入算法的后面3步了
for j in range(loop):

是算法中的第四步,不停的重复第二,第三步;
for i in range(meshFn.numPolygons):
    cmds.select("%.f[%d]" % (name, i), r=1)
    edges = cmds.polyInfo(fe=1)[0].split()[-3:]
    meshFn.split(((meshFn.kOnEdge, int(edges[2]), 0.5), (meshFn.kOnEdge, int(edges[1]), 0.5), (meshFn.kOnEdge, int(edges[0]), 0.5), (meshFn.kOnEdge, int(edges[2]), 0.5)))
    meshFn.deleteFace(meshFn.numPolygons - 1)
    meshFn.updateSurface()

就是对每个三角形进行分割并删除中间的三角形.
在python API 2.0多边形的顶点数,面数,uv数,边数等等都变成了,MFnMesh的实例属性而不是1.0中的方法,这更符合oop的概念,用起来也更简单方便,运行速度也相对快.
meshFn.numPolygons
# API 1.0
meshFn.numPolygons()

需要注意的是不要以为它们是实例属性就随便更改它们的数值,实际上它们是只读属性,就是你只能读取它们的值,不能覆盖或修改,如果你尝试修改,将会引发错误.
为了能将三角形进行分割,我们先要得到当前三角形的3条边,为了简单我就直接使用cmds
cmds.select("%.f[%d]" % (name, i), r=1)
edges = cmds.polyInfo(fe=1)[0].split()[-3:]

om.MFnMesh.split()有两中分割方式,一种是利用边上的点进行分割,就是提供两条边以上,每条边拿出一点来进行分割,另一种是拿面里面的点来进行分割,这个点不能是在所有边上面,也不能是面之外的点.也可以同时使用这两中方法.
这里我们需要在边的中点进行分割,所以先用om.MFnMesh.kOnEdge来确保在边上进行分割,然后指定是哪条边(的id)也就是上面得到的边,因为返回的是字符串列表,所以需要转换成int,最后是你希望在边上的点的位置,这个位置是基于百分比来计算的,所以我们需要0.5
meshFn.split(((meshFn.kOnEdge, int(edges[2]), 0.5), (meshFn.kOnEdge, int(edges[1]), 0.5), (meshFn.kOnEdge, int(edges[0]), 0.5), (meshFn.kOnEdge, int(edges[2]), 0.5)))

分割完成后我们需要把中间的三角形删除
meshFn.deleteFace(meshFn.numPolygons - 1)

为了能在下一个循环中得到正确的多边形信息,我们需要对多边形进行更新,实际上是只要你对多边形进行了添加或是删除的动作都应该调用下面的方法
meshFn.updateSurface()

最后我们创建的多边形是没有赋予材质的,给它一个材质
cmds.select(name, r=1)
cmds.hyperShade(a="lambert1")
cmds.select(cl=1)

如果你有兴趣的话,可以使用cmds来实现这个算法,或是pymel,又或是python API 1.0,除了pymel我都实现过了,最让我恶心的是API 1.0.
谢尔宾斯基三角形还有3d的版本,也以尝试去实现,挺好玩的.
  • 大小: 116.1 KB
  • 大小: 78.5 KB
  • 大小: 77.9 KB
分享到:
评论
1 楼 schi 2012-11-06  
meshFn.updateSurface()

并非是更新meshFn,而是告诉maya这个多边形的形状发生变化了,需要重新绘制.
API 2.0 的 MFnMesh是有bug的,上面的代码换成三角形不是使用
MFnMesh.create()

来创建,而是从场景中获取一个mesh节点就会在
meshFn.deleteFace(meshFn.numPolygons - 1)

执行失败,原因是meshFn.numPolygons没有被更新,其实就是你进行
meshFn.split(((meshFn.kOnEdge, int(edges[2]), 0.5), (meshFn.kOnEdge, int(edges[1]), 0.5), (meshFn.kOnEdge, int(edges[0]), 0.5), (meshFn.kOnEdge, int(edges[2]), 0.5)))

分割后,meshFn.numPolygons并没改变,而使用
MFnMesh.create()

来创建的三角形却更新了最新的信息.

相关推荐

    sierpinski-triangle.zip_Sierpinski_triangle_triangle code

    **塞尔皮斯基三角形(Sierpinski Triangle)** 塞尔皮斯基三角形,又称为谢尔宾斯基三角或谢尔宾斯基金字塔,是数学中一个经典的分形几何形状。这个图形是由波兰数学家瓦迪斯瓦夫·塞尔皮斯基在1915年提出的。它...

    sierpinski.zip_Sierpinski_matlab_sierpinski triangle

    ifs算法实现sierpinski三角形程序,Julia集

    Math Adventures with Python: An Illustrated Guide to Exploring Math with Code

    Use recursion to create fractals like the Koch snowflake and the Sierpinski triangle Generate virtual sheep that graze on grass and multiply autonomously Crack secret codes using genetic algorithms

    sierpinski-triangle:python代码那绘制了一个三角形

    在实际编程中,`sierpinski_triangle-main`可能是一个包含上述代码的主程序文件,运行这个文件将在Python环境中展示塞尔平斯基三角形的绘制过程。通过调整迭代深度,你可以控制图形的复杂程度,深度越高,图形的细节...

    matlab开发-SierpinskiFractalTriangle

    在提供的`sierpinski_triangle.m`文件中,代码可能包含以下几个关键部分: 1. **参数设置**:定义初始三角形的顶点坐标,以及迭代次数(决定分形的精细程度)。 2. **绘图函数**:使用MATLAB的绘图命令如`plot`或`...

    python 实现分形 课程设计 fractals 包括 朱莉娅集 科赫雪花 曼德布洛特 谢尔平斯基三角

    Sierpinski Triangle 分形,具有以非整数维形式充填空间的形态特征。 通常被定义为“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”,即具有自相似的性质。

    Sierpinski matlab实现

    function sierpinski_triangle_in_quadrants(n) % 画出四个子三角形 x = [0, 1, sqrt(3)/2, 0]; y = [0, 0, 1, 1]; for i = 1:4 % 平移每个子三角形到正确的位置 xq = x + [i/2 - 1/2, (i+1)/2 - 1/2, (i+1)/2...

    Math with Python: An Illustrated Guide to Exploring Math with Code.pdf

    - 使用矩阵绘制和转换2D和3D图形- 使用 复杂数字制作Mandelbrot和Julia集等彩色设计 - 使用递归创建分形,如Koch雪花和Sierpinski三角形 - 生成虚拟绵羊在草地上吃草并自主繁殖 - 使用遗传算法破解密码 当您完成本书...

    sierpinski_triangle:用于以任意迭代次数计算,显示和保存由2D或3D空间的三个给定点定义的Sierpinski分形三角形的功能

    在这个项目中,`sierpinski_triangle`是MATLAB编写的函数,能够根据用户指定的迭代次数,计算、显示并保存2D或3D空间中的Sierpinski分形三角形。这表明该功能不仅限于平面图形,还可能扩展到了三维空间,为用户提供...

    Sierpinski图形的实现

    OpenGL是一个用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。它提供了一系列函数来绘制基本的几何图形,如点、线和多边形,并支持纹理映射、阴影效果等高级功能。OpenGL的核心思想是通过定义顶点...

    matlab代码sqrt-Scaling_Sierpinski:Scaling_Sierpinski

    in : Metis Description : ' Sierpinski plots the Sierpinski triangle ' Keywords : scaling, topology, self-similar, mandelbrot, triangle, Sierpinski See also : Stable_Kelly_Rescaling, Stable_Kelly_...

    Sierpinski_Triangle:WebGL Sierpinski三角形

    这些库提供了封装好的API,使得创建Sierpinski三角形这样的复杂图形变得更加简单。例如,Three.js提供了一套完整的3D对象、几何体、材质和相机系统,让我们可以轻松地处理3D场景。 **实现步骤**: 1. **初始化场景...

    sier_pinski.zip_SIER_Sierpinski_magic

    Instead of using classical Cantor iteration algorithm,we introduce a cellular automation approach to the construction of Sierpinski triangle,which is simple,direct and magic.

    三角形分形绘图问题 C语言

    分形是以多种概念和方法相互冲击融合为特征的图形。分形所呈现的无穷玄机和美感引 发人们去探索。分形使人们觉悟到科学与艺术的融合,数学与艺术审美上的统一,使昨日枯 燥的数学不再仅仅是抽象...Sierpinski Triangle

    Matlab软件环境下的Sierpinski地毯及Sierpinski海绵的计算机模拟

    在Matlab软件环境中进行Sierpinski地毯及Sierpinski海绵的计算机模拟,涉及到的知识点主要包括:分形几何的基本概念、Sierpinski地毯与Sierpinski海绵的构造原理、Matlab软件的绘图功能及其在分形图形生成中的应用。...

    MFC VC++实现Sierpinski分形图像

    在计算机图形学领域,Sierpinski分形是一种经典的几何构造,它展示了分形理论的美妙之处。在VC++环境中,结合MFC(Microsoft Foundation Classes)框架和OpenGL库,我们可以创建一个程序来可视化Sierpinski分形图像...

    Sierpinski垫片matlab程序

    Sierpinski垫片是一种经典的分形几何图形,由波兰数学家Wacław Sierpiński在1915年提出。它通过一系列简单的迭代或递归步骤构造而成,展示了自相似性,即图形在不同尺度上具有相同的形状特征。在MATLAB中实现...

    基于MATLAB的Sierpinski地毯画法

    Sierpinski地毯是一种经典的分形图形,以其复杂的几何结构和无限自相似性著称。在MATLAB中,我们可以利用其强大的数学计算能力和图形绘制功能来实现Sierpinski地毯的绘制。本教程将深入探讨两种不同的方法:递归法和...

Global site tag (gtag.js) - Google Analytics