gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:17:38 26 4
gpt4 key购买 nike

开始进行 Maya C++ API 插件开发。我只想创建一个插件,当插件作为一种 hello world 插件运行时,它会生成一个单位大小为 1 的立方体。

我该怎么做?似乎严重缺乏关于如何做简单事情的教程。我查看了 Maya API C++ 示例,但没有关于我能看到的示例所执行的操作的描述。

最佳答案

我使用 Python API 2.0 创建了这个示例,因此您可以在脚本编辑器中执行它并使用它,然后再使用 C++ API,因为它并没有真正为您提供相同的灵 active 。

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 类。

您可以在此处找到更完整的文档:

基本上,要生成您自己的网格,您需要三样东西:

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

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

  1. 第一个数组有 8 个元素(因为立方体有 8 个顶点 - 我没有考虑最终的 segmentation )
  2. 第二个数组有 6 个元素(因为立方体有 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 个顶点(因此由四边形组成)。

最后一个数组。

有了这个,您不仅会描述需要使用女巫顶点来绘制每个 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 对象创建一个具有给定属性的新网格。


在这个例子中,我没有为这个单位立方体构建 UV,以避免增加这个例子的复杂性。

因此,如果您在选中立方体的情况下打开 UV 编辑器,则不会显示任何 UV。

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


警告

这个过程只创建网格,以及其他任何东西。

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


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

关于c++ - 如何在 Maya API C++ 中创建多边形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42286385/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com