- 浏览: 205158 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
悲梦天下:
楼主,有些视频到一半就没声音了,怎么破!!!
python视频教程 更新22(完) -
schi:
啊,我太傻了,都想到使用uv了,可以有更简单的方法,只要把uv ...
Get Reversed Normal Faces(获取反法线面) [原理] -
schi:
相对Pillow和PySide而言,显示图片opengl就显得 ...
display an image with pyopengl and Pillow -
schi:
我也是今天才偶然想到的,我以后可能用不着了,所有分享给有需要的 ...
Get Reversed Normal Faces(获取反法线面) [原理] -
baiyanbin:
支持楼主原创,关注楼主博客有一阵子了,国内认真认真搞技术的太少 ...
python视频教程 更新22(完)
sierpinski triangle 2d in maya(with python API 2.0)
在国庆前我刚好完成手上的工作,有两三天的空闲,于是就去研究了一下分形就当是练习算法,谢尔宾斯基三角形就是其中一个,关于它可以看http://en.wikipedia.org/wiki/Sierpinski_triangle
这里我们使用掏(去)心法和python API 2.0来实现谢尔宾斯基三角形2d(还存在3d的)版本.
算法很简单
- 创建或得到一个三角形,等腰三角形最好,但不是等腰也行,只不过看起来有点别扭而已
- 然后根据每条边的中点进行分割,可以得到4个三角形,把中间的三角形删除
- 把剩下的n个三角形重复第二步的分割和删除
- 不停的重复第二和第三步
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的版本,也以尝试去实现,挺好玩的.
评论
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()
来创建的三角形却更新了最新的信息.
发表评论
-
uv重叠(uv overlap)
2014-06-28 22:28 5353两年多前我需要解决uv重叠的问题,当时觉得是一个挺有挑 ... -
dx11 Shaders for maya
2014-06-09 17:48 2171我准备花点时间来弄点d ... -
Maya plugin with OpenCL C++ example
2014-04-23 12:19 3201GPU, Python and Maya使用的是python和 ... -
Get Reversed Normal Faces(获取反法线面) [原理]
2014-02-11 17:21 1546在Get Reversed Normal Faces(获取反法 ... -
cmdReporterHighlighter
2014-01-19 19:30 889A syntaxhighlighter I wrote ... -
那条线代表什么
2013-11-07 12:32 1256好几个月前我问了前同事一个问题:那条线代表什么? 同事在玩 ... -
Modern OpenGL with python (freeglut, glfw, PySide/PyQt)
2013-11-04 15:28 6549Base on this tutorial 基于这个教程 ht ... -
python视频教程 更新22(完)
2013-09-07 20:31 2280实际上最后的类实战的ood是不正确,虽然Point类和Vect ... -
Add MEL syntax highlighting for expression editor[给表达式编辑器添加mel的高光显示]
2013-08-30 18:16 1956I don't use mel for years. But ... -
GPU, Python and Maya
2013-06-27 17:32 3139Here an example how to use pyop ... -
mentalray cause maya2012 crash on standalone mode
2013-03-28 20:27 1082如果你想使用maya2012和python来做些批处理,你就要 ... -
python基础视频教程
2013-08-14 15:56 1722我打算做一系列的python基础视频教程。 目前的计划是从0基 ... -
convert color image to grayscale with pyopencl(example code)
2013-03-09 20:38 2262grayscale.py import pyopencl as ... -
sierpinski triangle 2d maya plug-in(with python API 2.0)
2012-11-07 16:55 2339因为python API 2.0可用的类很少,OpenMaya ... -
mel,cmds,python API哪个更快?
2012-09-13 14:37 3956昨天偶然的跟同事谈论 ... -
Maya Python API 2.0 - MGlobal
2012-08-31 18:07 2312MGlobal是一个静态类,提供通用的API涵数. 包括获取m ... -
Get Reversed Normal Faces(获取反法线面)
2012-08-20 18:34 1759这不是一个教程,这是 ... -
Maya Python API 2.0 - MSelectionList
2012-07-09 14:03 2545从Maya2012开始我们迎来了新的Python API, ... -
我讨厌给UI起名字,也懒得起名字
2012-07-05 14:35 1364从我开始给Maya开发UI工具的时候起就觉得给窗口起名是件麻烦 ... -
算法(algorithm) 101
2012-07-02 23:01 1170在Maya中实现深度/广度优先搜索算法 Depth-First ...
相关推荐
**塞尔皮斯基三角形(Sierpinski Triangle)** 塞尔皮斯基三角形,又称为谢尔宾斯基三角或谢尔宾斯基金字塔,是数学中一个经典的分形几何形状。这个图形是由波兰数学家瓦迪斯瓦夫·塞尔皮斯基在1915年提出的。它...
ifs算法实现sierpinski三角形程序,Julia集
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-main`可能是一个包含上述代码的主程序文件,运行这个文件将在Python环境中展示塞尔平斯基三角形的绘制过程。通过调整迭代深度,你可以控制图形的复杂程度,深度越高,图形的细节...
在提供的`sierpinski_triangle.m`文件中,代码可能包含以下几个关键部分: 1. **参数设置**:定义初始三角形的顶点坐标,以及迭代次数(决定分形的精细程度)。 2. **绘图函数**:使用MATLAB的绘图命令如`plot`或`...
Sierpinski Triangle 分形,具有以非整数维形式充填空间的形态特征。 通常被定义为“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”,即具有自相似的性质。
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...
- 使用矩阵绘制和转换2D和3D图形- 使用 复杂数字制作Mandelbrot和Julia集等彩色设计 - 使用递归创建分形,如Koch雪花和Sierpinski三角形 - 生成虚拟绵羊在草地上吃草并自主繁殖 - 使用遗传算法破解密码 当您完成本书...
在这个项目中,`sierpinski_triangle`是MATLAB编写的函数,能够根据用户指定的迭代次数,计算、显示并保存2D或3D空间中的Sierpinski分形三角形。这表明该功能不仅限于平面图形,还可能扩展到了三维空间,为用户提供...
OpenGL是一个用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。它提供了一系列函数来绘制基本的几何图形,如点、线和多边形,并支持纹理映射、阴影效果等高级功能。OpenGL的核心思想是通过定义顶点...
in : Metis Description : ' Sierpinski plots the Sierpinski triangle ' Keywords : scaling, topology, self-similar, mandelbrot, triangle, Sierpinski See also : Stable_Kelly_Rescaling, Stable_Kelly_...
这些库提供了封装好的API,使得创建Sierpinski三角形这样的复杂图形变得更加简单。例如,Three.js提供了一套完整的3D对象、几何体、材质和相机系统,让我们可以轻松地处理3D场景。 **实现步骤**: 1. **初始化场景...
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.
分形是以多种概念和方法相互冲击融合为特征的图形。分形所呈现的无穷玄机和美感引 发人们去探索。分形使人们觉悟到科学与艺术的融合,数学与艺术审美上的统一,使昨日枯 燥的数学不再仅仅是抽象...Sierpinski Triangle
在Matlab软件环境中进行Sierpinski地毯及Sierpinski海绵的计算机模拟,涉及到的知识点主要包括:分形几何的基本概念、Sierpinski地毯与Sierpinski海绵的构造原理、Matlab软件的绘图功能及其在分形图形生成中的应用。...
在计算机图形学领域,Sierpinski分形是一种经典的几何构造,它展示了分形理论的美妙之处。在VC++环境中,结合MFC(Microsoft Foundation Classes)框架和OpenGL库,我们可以创建一个程序来可视化Sierpinski分形图像...
Sierpinski垫片是一种经典的分形几何图形,由波兰数学家Wacław Sierpiński在1915年提出。它通过一系列简单的迭代或递归步骤构造而成,展示了自相似性,即图形在不同尺度上具有相同的形状特征。在MATLAB中实现...
Sierpinski地毯是一种经典的分形图形,以其复杂的几何结构和无限自相似性著称。在MATLAB中,我们可以利用其强大的数学计算能力和图形绘制功能来实现Sierpinski地毯的绘制。本教程将深入探讨两种不同的方法:递归法和...