2017-02-16 39 views
0

進入maya C++ API插件開發。我只是想創建一個插件,當插件作爲hello world插件運行時,它會生成單位大小爲1的多維數據集。如何在maya API中創建多邊形C++

我該怎麼做?似乎缺乏關於如何做簡單事情的教程。我已經看過Maya API C++示例,但是沒有關於這些示例所做的描述,我可以看到。

回答

1

我已經使用Python API 2.0創建了這個示例,所以您可以在腳本編輯器內部執行它並使用它,然後再使用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類。

您可以在這裏找到一個更完整的文檔:

基本上,生成自己的網格,你需要三樣東西:

  1. 數組點數(具體MPoints)
  2. 每個面的頂點數的數組
  3. 每個面的頂點數的數組。

所以,在一個立方體,我們將有:

  1. 第一陣列與8個元素(因爲立方體有8個頂點 - 我沒有考慮到最終的細分)
  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,該過程也幾乎相同,除了您還需要調用方法assignUV實際將UV應用於多邊形。


警告

這個過程只創建網格,和其他任何東西。

這意味着當您執行此代碼時,視口中的網格將爲綠色,這意味着沒有着色器被分配給網格。


與完整的例子 https://gist.github.com/andrearastelli/fb297e6cac8cb745e90c273e7ff53a1d

一個片段
相關問題