如何在Maya API C 中创建多边形

How to create a polygon in maya API C++

本文关键字:创建 多边形 API Maya      更新时间:2023-10-16

进入Maya C API插件开发。我只想创建一个插件,该插件在运行插件作为一种Hello World插件时生成单位尺寸1的立方体。

我该怎么做?关于如何做简单的事情,似乎很严重的教程。我已经查看了Maya API C 示例,但是没有描述我可以看到的示例。

我已经使用python api 2.0创建了此示例,因此您可以在脚本编辑器中执行它并使用它,然后再使用C API,该c api并没有真正为您提供相同的情况灵活性。

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 -PYTHON API 2.0
  • MFNMESH -C API

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

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

所以,在立方体中,我们将有:

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

在单位立方体情况下,第一个数组非常简单且自我解释:

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个顶点,每个顶点都具有特定的坐标相对于原点。

第二个数组也很简单。

polygonCounts = []
polygonCounts.append(4)
polygonCounts.append(4)
polygonCounts.append(4)
polygonCounts.append(4)
polygonCounts.append(4)
polygonCounts.append(4)

在这里,我已经定义了我的立方体,每个脸部都有4个顶点(由Quads组成)。

最后一个最后一个数组。

使用此

,您不仅需要使用巫婆顶点来绘制每个4面脸,还可以根据顶点ID的插入顺序来定义每个面部的正常方向。<<<<<<<<

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]

所有其他面的相同。

最后一行:

mesh.create(vertices, polygonCounts, polygonConnects)

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


在此示例中,我尚未为该单元立方体构建UVS,以避免在此示例中添加复杂性。

因此,如果您使用选定的立方体打开UV编辑器,则不会显示紫外线。

这没什么大不了的,因为您可以创建紫外线并按照自己喜欢的方式解开多边形,但是如果您想创建甚至紫外线,则过程几乎相同,除了您还需要调用该过程方法assignUV实际将UV应用于多边形。


警告

此过程只会创建网格和其他任何东西。

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


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