maya中的种树脚本

题记:

         公司项目要求,做场景时候需要ass的代理,于是需要一个刷树的脚本。


思路:

        网上其实有蛮多刷草刷树的工具,我也下载了一个,不过是mel写的。于是决定自己写一个。把这个问题分解开有以下几步:

1,让用户选择一个需要种的树的模型和地面模型。

2,用户在maya的3d视图中点击一下鼠标,复制一颗树。

        3,将树移到鼠标点击的地面模型位置。


问题的关键:

       1,如何在maya中实现鼠标点击的事件。

2,如何求视图中鼠标点击时候,与视图中的模型的交互位置


解决:

1,鼠标的点击事件。

我先查了maya api,在proxy模块里有MPxContext类,可以创建各种鼠标交互事件,不过很可惜的是,这个类不能在python中导入,如果有大神指导如何在python api中导入这个类,请赐教!

最后我在maya.cmds里找到的鼠标点击事件draggerContext,它支持鼠标点击,鼠标拖拽,鼠标施放以及鼠标点击之前的事件。并且可以获取点击时候鼠标在视窗中的2d位置。


2,将鼠标的位置转换成三维空间和地面物体的交互。


maya在api中有很多对3d视窗的方法,例如:获取视窗的摄像机,获取视窗的widget,获取视窗的大小等等。我们需要获取的是鼠标在视窗中的坐标。

创建一个view对象

import maya.OpenMayaUI as omUI
view = omUI.M3dView.active3dView()

用viewToWorld方法获取点击鼠标时,视线到鼠标点击位置的射线的起始位置和方向。

worldPt = om.MPoint()
worldVector = om.MVector()
view.viewToWorld(x_pos,y_pos,worldPt,worldVector)

worldPt就是视线的起始点,worldVector是视线起始点到鼠标点击位置的射线。

然后就是求该射线与地面物体的交点,

import maya.OpenMaya as om
om.MFnMesh.closestIntersection()

用该方法可获取射线与物体的交点。

剩下的就是复制物体,移动位置。


上张截图:



后记:

作为主要功能,基本完成了。参考网上的工具,其实后续可以开发随机旋转缩放,树的缩略图等等。


猜你喜欢

转载自blog.csdn.net/xdhstc/article/details/52526335