maya - 使用 Python 在 Maya 中计算顶点的法线
问题描述
当我点亮它指向我的对象时,我有一个脚本。我用 normalConstrain 做到了这一点。但是有没有其他方法可以不受约束地做到这一点?
我想我需要从我的 Light 计算最近顶点的法线?但是我不知道该怎么做,如果有人可以帮助我,那就太好了!
这是我做 NormalConstrain 的方法:
myNormalConstrain = cmds.normalConstraint('mySphere','myLight', aimVector = (0,0,1), worldUpType = 'scene',name='NormalConstrainToObject')
解决方案
简单的方法是创建一个最接近点OnMesh 节点并将其连接到worldMesh
网格的属性。唯一的问题是 Maya 2016 中存在一个错误(不确定其他错误),如果您使用厘米以外的单位,则从节点返回的正常值实际上并未归一化。这是一个执行此操作的函数:
import maya.cmds as cmds
import maya.api.OpenMaya as api
def get_closest_normal(surface, x, y , z):
node = cmds.createNode('closestPointOnMesh')
cmds.connectAttr(surface + '.worldMesh ', node + ".inMesh")
cmds.setAttr( node + ".inPosition", x, y, z, type='double3')
normal = cmds.getAttr(node + ".normal")
# there's a bug in Maya 2016 where the normal
# is not properly normalized. Not sure
# if it's fixed in other years.... this
# is the workaround
result = api.MVector(*normal)
cmds.delete(node)
result.normalize()
return result
print get_closest_normal('pSphereShape1', 10, 1, 1)
您可以保留节点并将其正常属性连接到实时更新的某些东西,而不是像此处那样获取编号并删除节点。然而,这是一个相当昂贵的更新节点,所以不要在没有测试性能以确保它负担得起的情况下将该版本用于动画装备之类的东西
推荐阅读
- visual-studio - ImportError:在终端中运行时没有名为 bs4 的模块
- jwt - 带有 RS256 加密 JWT 的 PostGraphile“无效算法”错误
- .net-core - ws-federation dotnet core 没有对 wsignoutcleanup1.0 做任何事情
- sql - 如何显示由于服务更改而重复的值的单个项目列表
- excel - VBA中的Countif函数与动态标准
- c++ - 这两个函数的操作顺序是什么
- sql - 在 MS ACCESS 中使用 SELF JOIN 对多列求和
- snowflake-cloud-data-platform - Snowflake 是否在集群中的多个节点或单个节点上执行“单个”单个查询?
- css - 下拉导航
- c# - C#格式双重限制有效数字但限制科学记数法