gpt4 book ai didi

c# - 按偏移量/矢量移动每个 UV 顶点

转载 作者:太空宇宙 更新时间:2023-11-03 15:02:29 26 4
gpt4 key购买 nike

我想创建第二个 UV 集,然后通过向量 u=0, v=1.0/number of vertices 移动对象中的每个 UV 顶点。为 4 个顶点平面创建的新 UV 顶点坐标应如下所示:对于顶点 0 (u=0,v=0),对于顶点 1 (u=0,v=0.25) ,对于顶点 2 (u=0,v=0.5),对于顶点 3 (u=0,v=0.75),等等。

我有一个 C# 源代码:

Vector2[] UV2 = new Vector2[m.vertexCount];

float HalfTexelSize = (1f/ (float)m.vertexCount)/2f;

for (int i = 0; i < m.vertexCount; i++) {

UV2[i] = new Vector2(0f, (float)i / (float)m.vertexCount) + new Vector2(0f, HalfTexelSize);
}

m.uv2 = UV2;
meshFilter.mesh = m;

就我的研究而言,Python 中没有向量,现在我被解决方案困住了。到目前为止,我想到了这个:

import maya.cmds as cmds

cmds.polyUVSet(create=True, uvSet='map2')
vertexCount = cmds.polyEvaluate(v=True)
vertexCount_float = float(vertexCount)
HalfTextureSize = (1.0/vertexCount/2.0)
x = 1.0/vertexCount
sel = cmds.ls(sl=1, fl=1)

for i in sel:
i=0, i<sel
cmds.polyEditUV(uValue=0.0, vValue=x)

但我得到的输出是第二个 UV 集,每个顶点都在 (0,0) UV 坐标中。谁能帮我?任何 MEL/Python 解决方案将不胜感激。

最佳答案

默认的 maya pyhon 中没有矢量。

如果你想要一个纯 python 解决方案 this project是一个单文件矢量库。

您还可以直接使用 API 从 Maya 获取 3 向量:

from maya.api.OpenMaya import MVector

v1 = MVector(1,2,3)
v2 = MVector(3,4,5)
print v1 + v2

这些是 3d 向量,但您可以忽略 3d 分量

对于实际创建和编辑 UV 集,需要考虑几个复杂问题

  1. 只要创建一个新的 UV 集就可以得到一个集;该集存在但不包含任何 UV。顶点和 UV 之间的关系并不总是 1:1,一个物理顶点可以有多个 UV,并且可以有未映射的顶点。要创建一个 1-uv-per-vertex 贴图,最简单的方法是应用一个简单的平面贴图或球体贴图。
  2. 您需要设置“当前 uv 集”,以便 maya 知道您要处理哪个集。不幸的是,当您向 maya 询问 UV 集名称时,它会为您提供 unicode,但当您设置它们时,它需要字符串(至少在 2016 年 - 我认为这是一个错误)
  3. 如果您当前的代码是一个指示,那么您真的不需要矢量来设置它。

最终的解决方案看起来像这样:

import maya.cmds as cmds

# work on only one selected object at a time
selected_object = cmds.ls(sl=1, fl=1)[0]
vertexCount = cmds.polyEvaluate(selected_object, v=True)

# add a projection so you have 1-1 vert:uv mapping
cmds.polyPlanarProjection(selected_object, cm=True)
# get the name of the current uv set
latest_uvs = cmds.polyUVSet(selected_object, q=True, auv=True)
# it's a unioode by default, has to be a string
new_uv = str(latest_uvs[-1])
# set the current uv set to the newly created one
cmds.polyUVSet(selected_object, e=True, cuv = True, uvs=new_uv)
vert_interval = 1.0 / vertexCount

for vert in range (vertexCount):
uv_vert = "{}.map[{}]".format (selected_object, vert)
cmds.polyEditUV( uv_vert, u= 0, v = vert * vert_interval, relative=False, uvs=new_uv)

关于c# - 按偏移量/矢量移动每个 UV 顶点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45459704/

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