Maya:草生成器python

2024-04-27 12:49:47 发布

您现在位置:Python中文网/ 问答频道 /正文

大家好,我正在尝试创建一个草生成器,使用maya python获取一个圆锥体,对其进行变形、复制,然后在我选择的几何体上随机传播它

我是一个初学者,我只接触到了复制部分,我如何才能在表面上传播叶片(草)?,谢谢

import maya.cmds as MC
from random import uniform as RN

blade = MC.polyCone( sx=3, sy=5, sz=0, r=0.04, h=1, ax=(0, 1, 0))
MC.setAttr (blade[0] + '.translateY', (.5)) 
MC.delete(ch=True)
MC.polySoftEdge ( a=0 )

#adding deformer

bend = MC.nonLinear( type='bend', lowBound=0, highBound = 2,  
curvature=30)
vtxPos = MC.xform(blade[0]+'.vtx[0]', q=True, t=True, ws=True)
MC.xform(bend, t=(0,vtxPos[1], 0))

MC.select (blade[0])
MC.delete(ch=True)
MC.makeIdentity(apply=True, t=1, r=1, s=1, n=0)
groupblades = MC.group(empty=True, name=blade[0] + '_grp#') 

for i in range(200):
    obj = MC.instance(blade[0])
    MC.move(RN(1,-1), 0, RN(1,-1), blade[0])
    MC.rotate(0, RN(0,360),0, blade[0])
    MC.parent(obj, groupblades)

Tags: importtrueobjasrnchmcdelete
1条回答
网友
1楼 · 发布于 2024-04-27 12:49:47

在曲面上散布物体肯定有很多不同的方法。可以使用几何体和法线约束。还有MASH的框架。但我认为使用毛囊是很容易的,并且需要较少的开销。唯一需要注意的是,曲面必须具有UV,因为这是我们移动毛囊的方式

下面是我的建议:

  1. 创建毛囊,并将其连接到要散布到的曲面
  2. 创建草对象
  3. 每次实例化新草时,为毛囊拾取一个随机uv以使其弹出。这将使其与面的位置和法线对齐
  4. 使用毛囊的变换将草移动/旋转到
  5. 冲洗并重复步骤3&;4.

下面是一个完整的示例:

import maya.cmds as cmds
import random

surface = "pPlane1"  # Specify the object you want to scatter on.

fol_shape = cmds.createNode("follicle")  # Create a new follicle object.
fol = cmds.listRelatives(fol_shape, f=True, parent=True)[0]  # Get the follicle's transform.

# Below we are connecting the follicle to the surface so we can control it with its uvs.
cmds.connectAttr("{}.outMesh".format(surface), "{}.inputMesh".format(fol))
cmds.connectAttr("{}.worldMatrix[0]".format(surface), "{}.inputWorldMatrix".format(fol))
cmds.connectAttr("{}.outTranslate".format(fol_shape), "{}.translate".format(fol))
cmds.connectAttr("{}.outRotate".format(fol_shape), "{}.rotate".format(fol))
cmds.setAttr("{}.simulationMethod".format(fol_shape), 0)

# Begin creating blade of grass.
blade = cmds.polyCone(sx=3, sy=5, sz=0, r=0.04, h=1, ax=(0, 1, 0))
cmds.setAttr(blade[0] + '.translateY', .5) 
cmds.delete(ch=True)
cmds.polySoftEdge(a=0)

# Setting wirecolor to green so it's easier to see.
cmds.setAttr(blade[0] + ".overrideEnabled", True)
cmds.setAttr(blade[0] + ".overrideRGBColors", True)
cmds.setAttr(blade[0] + ".overrideColorRGB", 0.06, 0.2, 0.06)

bend = cmds.nonLinear(type='bend', lowBound=0, highBound=2, curvature=30)
vtxPos = cmds.xform(blade[0] + '.vtx[0]', q=True, t=True, ws=True)
cmds.xform(bend, t=(0, vtxPos[1], 0))

cmds.select(blade[0])
cmds.delete(ch=True)
cmds.makeIdentity(apply=True, t=1, r=1, s=1, n=0)
groupblades = cmds.group(empty=True, name=blade[0] + '_grp#') 

for i in range(400):
    obj = cmds.instance(blade[0])

    # Randomly set the follicle's uv so it's jumps somewhere else on the surface. Value needs to be between 0.0-1.0
    cmds.setAttr("{}.parameterU".format(fol_shape), random.random())
    cmds.setAttr("{}.parameterV".format(fol_shape), random.random())
    cmds.matchTransform(obj, fol)  # Make grass match follicle's position/rotation/scale.
    cmds.rotate(-90, random.random() * 360, 0, obj, r=True)  # Rotate it upright and give it random twist.
    cmds.move(0, 0.4, 0, obj, r=True)  # The grass's pivot is in the center, so need to offset translation a bit up.
    cmds.parent(obj, groupblades)

cmds.delete(fol)  # Follicle no longer needed, so delete it.

有一部分我需要把草向上移动一点,因为枢轴点在草的中心。这是一个小技巧,真正的解决方案是在草地的底部建造一个枢轴点。这样做可以解决任何漂浮的草,并使随机化缩放更容易

以下是它将输出的内容:

Scatter example

相关问题 更多 >