首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在maya C++中创建多边形

如何在maya C++中创建多边形
EN

Stack Overflow用户
提问于 2017-02-16 23:02:48
回答 1查看 2.3K关注 0票数 0

进入maya C++ API插件开发。我只想创建一个插件,当运行中的插件作为hello world插件运行时,生成一个单元大小为1的立方体。

我该怎么做?关于如何做简单的事情,似乎严重缺乏教程。我看过Maya C++示例,但是没有描述这些示例所做的事情。

EN

回答 1

Stack Overflow用户

发布于 2017-03-05 11:22:47

我使用PythonAPI2.0创建了这个示例,这样您就可以在脚本编辑器中执行它并对它进行播放,然后再使用C++ API,因为它实际上并没有给您提供相同的灵活性。

代码语言:javascript
复制
import maya.cmds as mc

import maya.api.OpenMaya as OpenMaya


mesh = OpenMaya.MFnMesh()

# Simple unitCube coordinates
vertices = []
vertices.append(OpenMaya.MPoint(1, 1, 1))       # 0
vertices.append(OpenMaya.MPoint(1, -1, 1))      # 1
vertices.append(OpenMaya.MPoint(1, -1, -1))     # 2
vertices.append(OpenMaya.MPoint(1, 1, -1))      # 3
vertices.append(OpenMaya.MPoint(-1, -1, 1))     # 4
vertices.append(OpenMaya.MPoint(-1, 1, 1))      # 5
vertices.append(OpenMaya.MPoint(-1, 1, -1))     # 6
vertices.append(OpenMaya.MPoint(-1, -1, -1))    # 7

# Number of vertices per polygon
polygonCounts = []
polygonCounts.append(4)
polygonCounts.append(4)
polygonCounts.append(4)
polygonCounts.append(4)
polygonCounts.append(4)
polygonCounts.append(4)

# How each group of N vertices per polygon is connected.
#
# Because for each vertex I have specified the list index number, I can use the
# same number to uniquely identify each face of the polygon to actually build
# the connection between each vertex.
polygonConnects = []

# First polygon
polygonConnects.append(0)
polygonConnects.append(1)
polygonConnects.append(2)
polygonConnects.append(3)

# Second polygon
polygonConnects.append(0)
polygonConnects.append(5)
polygonConnects.append(4)
polygonConnects.append(1)

# Third polygon
polygonConnects.append(5)
polygonConnects.append(6)
polygonConnects.append(7)
polygonConnects.append(4)

# Fourth polygon
polygonConnects.append(6)
polygonConnects.append(3)
polygonConnects.append(2)
polygonConnects.append(7)

# Fifth polygon
polygonConnects.append(0)
polygonConnects.append(3)
polygonConnects.append(6)
polygonConnects.append(5)

# Sixth polygon
polygonConnects.append(1)
polygonConnects.append(4)
polygonConnects.append(7)
polygonConnects.append(2)

mesh.create(vertices, polygonCounts, polygonConnects)

在本例中:

MFnMesh是处理网格及其操作的API类。

您可以在这里找到更完整的文档:

  • MFnMesh -PythonAPI2.0
  • MFnMesh - C++ API

基本上,要生成您自己的网格,您需要3件事情:

  1. 一个点数组(特别是MPoints)
  2. 每个面的顶点计数数组
  3. 每个面的顶点id数组。

因此,在一个立方体中,我们将拥有:

  1. 第一个包含8个元素的数组(因为一个立方体有8个顶点--我没有考虑最终的细分)
  2. 第二个包含6个元素的数组(因为一个立方体有6个面)
  3. 包含6 * 4元素的第三个数组,因为对于每个面,我们有4个顶点。

在单元多维数据集的情况下,第一个数组非常简单且不言自明:

代码语言:javascript
复制
vertices = []
vertices.append(OpenMaya.MPoint(1, 1, 1))       # 0
vertices.append(OpenMaya.MPoint(1, -1, 1))      # 1
vertices.append(OpenMaya.MPoint(1, -1, -1))     # 2
vertices.append(OpenMaya.MPoint(1, 1, -1))      # 3
vertices.append(OpenMaya.MPoint(-1, -1, 1))     # 4
vertices.append(OpenMaya.MPoint(-1, 1, 1))      # 5
vertices.append(OpenMaya.MPoint(-1, 1, -1))     # 6
vertices.append(OpenMaya.MPoint(-1, -1, -1))    # 7

正如你所看到的,我有8个顶点,每个顶点都有相对于原点的特定坐标。

第二个数组也很简单。

代码语言:javascript
复制
polygonCounts = []
polygonCounts.append(4)
polygonCounts.append(4)
polygonCounts.append(4)
polygonCounts.append(4)
polygonCounts.append(4)
polygonCounts.append(4)

在这里,我定义了我的立方体对于每个面都有4个顶点(所以是由四元组成的)。

最后一个数组。

用这张图,你不仅可以描述女巫顶点需要用来绘制每个四面面,还可以帮助你根据插入顶点ids的顺序来定义每个面的正常方向。

代码语言:javascript
复制
polygonConnects = []

# First polygon
polygonConnects.append(0)
polygonConnects.append(1)
polygonConnects.append(2)
polygonConnects.append(3)

# Second polygon
polygonConnects.append(0)
polygonConnects.append(5)
polygonConnects.append(4)
polygonConnects.append(1)

# Third polygon
polygonConnects.append(5)
polygonConnects.append(6)
polygonConnects.append(7)
polygonConnects.append(4)

# Fourth polygon
polygonConnects.append(6)
polygonConnects.append(3)
polygonConnects.append(2)
polygonConnects.append(7)

# Fifth polygon
polygonConnects.append(0)
polygonConnects.append(3)
polygonConnects.append(6)
polygonConnects.append(5)

# Sixth polygon
polygonConnects.append(1)
polygonConnects.append(4)
polygonConnects.append(7)
polygonConnects.append(2)

因此,第一个面是用顶点构建的:[0, 1, 2, 3],由于它们在空间中的位置,这个顺序也定义了这个面的正常点指向[1, 0, 0]

其他人的脸也是一样。

最后一行:

代码语言:javascript
复制
mesh.create(vertices, polygonCounts, polygonConnects)

简单地告诉MFnMesh对象使用给定的属性创建一个新的网格。

在本例中,我还没有为这个单元多维数据集构建UV,以避免增加此示例的复杂性。

因此,如果您打开紫外线编辑器与选择的立方体,没有紫外线将显示。

这不是什么大问题,因为您可以创建UV并按您喜欢的方式展开多边形,但是如果您想创建甚至UV,这个过程几乎是一样的,除了您还需要调用方法assignUV来实际将UV应用到多边形。

警告

此过程只创建网格,以及其他任何内容。

这意味着当您执行此代码时,视图中的网格将是绿色的,这意味着没有为网格分配任何着色器。

带有完整示例https://gist.github.com/andrearastelli/fb297e6cac8cb745e90c273e7ff53a1d的片段

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42286385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档