A-A+

山山讲堂 Maya建模教程之车轮建模

2014-10-03 互动内容
一、山山讲堂 Maya建模教程之车轮建模
很多人要求我讲解一下汽车的建模方法。一般来说,我比较喜欢将一个复杂的3D数字模型分解成相对简单的数字模型去制作,汽车也不例外,所以今天我们就首先来制作一下汽车的车轮。

  先来看看一个产品级的车轮效果吧:

  

山山讲堂 Maya建模教程之车轮建模
  这是我们今天要建模的车轮外观:

  

山山讲堂 Maya建模教程之车轮建模
  在制作前,我建议大家最好找一些车轮的图片作为参考,这样可以方便建模和绘制曲线。我们的建模思路如下:

  1 制作轮胎

  2 制作轮毂

  3 制作轮盘

  将Maya界面调整到Surfaces模块。在front视图,使用CV曲线命令绘制一条线,具体位置参考下图所示。

  

山山讲堂 Maya建模教程之车轮建模
  执行Surfaces>Revolve命令,制作出车轮的轮胎。

  

山山讲堂 Maya建模教程之车轮建模
  在front视图,再次使用CV曲线命令绘制一条线,具体位置参考下图所示。

  

山山讲堂 Maya建模教程之车轮建模
  执行Surfaces>Revolve命令,制作出车轮的轮毂。

  

山山讲堂 Maya建模教程之车轮建模
  重复上面的步骤,绘制曲线,旋转成型。

  

山山讲堂 Maya建模教程之车轮建模 山山讲堂 Maya建模教程之车轮建模
  将三者组装起来,我们可以发现车轮的雏形已经基本完成了。

  

山山讲堂 Maya建模教程之车轮建模
  前面我们讲解得非常快,主要是因为从建模技术上来讲是非常容易的,这些地方主要考察是用户对车轮结构的了解程度。而下面制作的轮盘,虽然在车轮上只起到装饰作用,但从建模技术上讲却是相当复杂的,也是我们本课的重点讲解内容。

  根据轮毅尺寸,在前视图绘制轮盘旋转曲线

  

山山讲堂 Maya建模教程之车轮建模
  旋转成面。

  

山山讲堂 Maya建模教程之车轮建模
  在Revolve历史记录中修改段数为12。

  

山山讲堂 Maya建模教程之车轮建模
  在顶视图绘制如下曲线。

  

山山讲堂 Maya建模教程之车轮建模
  使用Dulplicate Special命令进行阵列复制5个。

  

山山讲堂 Maya建模教程之车轮建模
  使用“Project Curves On Surface”命令将阵列出来的曲线投射到轮盘表面。注意:使用该命令一定要在顶视图进行。

  

山山讲堂 Maya建模教程之车轮建模
  紧接上一步,选择轮盘面,使用“Trim Tool”命令修剪曲面。注意,点选要保留的曲面,按Enter键结束。

  

山山讲堂 Maya建模教程之车轮建模
  将该曲面复制,并下移。

  

山山讲堂 Maya建模教程之车轮建模
  选择两个曲面,鼠标右键,选择“Trim Edge”,选择如图所示的边。注意:一定要选择“Trim Edge”,而非Isoparm。

  

山山讲堂 Maya建模教程之车轮建模
  使用“Loft”命令进行放样。

  

山山讲堂 Maya建模教程之车轮建模
为了加快运行速度,我们可以删除不必要的历史。

  选择放样的面和轮盘面相交的边,使用“Round Tool”命令进行倒角。注意:该命令默认情况下倒角是1,我们需要调整到适当的大小,否则倒角不可见。在这里我们使用的倒角大小为0.02。

  

山山讲堂 Maya建模教程之车轮建模 山山讲堂 Maya建模教程之车轮建模 山山讲堂 Maya建模教程之车轮建模
  在顶视图绘制圆,如下图所示。

  

山山讲堂 Maya建模教程之车轮建模
  使用Dulplicate Special命令进行阵列复制11个。

  

山山讲堂 Maya建模教程之车轮建模
  使用“Project Curves On Surface”命令将阵列出来的曲线投射到轮盘表面。

  

山山讲堂 Maya建模教程之车轮建模
  紧接上一步,选择轮盘面,使用“Trim Tool”命令修剪曲面。

  

山山讲堂 Maya建模教程之车轮建模
  选择如图所示的线。

  

山山讲堂 Maya建模教程之车轮建模
  使用“Duplicate Surface Curves”命令,将选择的曲线复制,并下移。

  

山山讲堂 Maya建模教程之车轮建模
  使用Loft命令进行放样。

  

山山讲堂 Maya建模教程之车轮建模
  使用“Round Tool”命令进行倒角。

  

山山讲堂 Maya建模教程之车轮建模
  将所有的部件进行组装,最终效果如图:

  

山山讲堂 Maya建模教程之车轮建模


二、山山讲堂 Maya建模教程之车轮建模 之:山山讲堂 Maya建模教程之电话建模
本是想通过这篇教程介绍另外一种建模方法——鼎鼎大名的细分建模(Subdiv),但在录制过程中,由于惯性思维的影响,还是采用了多边形建模,不能不说是一个遗憾。为了弥补过失,我将在下一篇飞船建模的教程中与大家详细分享细分建模技术。

  先来看一下最终的效果:

  

山山讲堂 Maya建模教程之电话建模
  创建一个Cube,按照下图参数进行调整。

  

山山讲堂 Maya建模教程之电话建模

山山讲堂 Maya建模教程之电话建模 山山讲堂 Maya建模教程之电话建模
  进入点级别,调整点的位置。

  

山山讲堂 Maya建模教程之电话建模
  使用“Insert Edge Loop Tool”工具添加环线。

  技巧:在使用Insert Edge Loop Tool工具的时候,为了一次性添加,我们可以打开改工具的设置选项,具体设置如下:  

山山讲堂 Maya建模教程之电话建模
  使用Extrude命令进行三次挤压,效果如下图所示。

  

山山讲堂 Maya建模教程之电话建模
  添加环线,保留形状。

  

山山讲堂 Maya建模教程之电话建模
  使用Extrude命令进行挤压。

  

山山讲堂 Maya建模教程之电话建模
  添加环线,保留形状。

  

山山讲堂 Maya建模教程之电话建模
  重复上面的方法,制作出下图所示部分。

  

山山讲堂 Maya建模教程之电话建模
  使用Extrude挤压,并调整点的位置。

  

山山讲堂 Maya建模教程之电话建模
  继续挤压。

  

山山讲堂 Maya建模教程之电话建模
  使用“split polygon tool“添加线,保留形状。

  

山山讲堂 Maya建模教程之电话建模 山山讲堂 Maya建模教程之电话建模
  挤压面,记住一定要关闭“keep faces together”选项。  
山山讲堂 Maya建模教程之电话建模 山山讲堂 Maya建模教程之电话建模
  添加环线,保留形状。

  

山山讲堂 Maya建模教程之电话建模 山山讲堂 Maya建模教程之电话建模
  细分。

  

山山讲堂 Maya建模教程之电话建模
下面我们来制作话筒。

  创建Cube,具体参数如下图所示。

  

山山讲堂 Maya建模教程之电话建模

山山讲堂 Maya建模教程之电话建模 山山讲堂 Maya建模教程之电话建模
  F8进入点级别,调整点的位置。

  

山山讲堂 Maya建模教程之电话建模
  添加环线,保留形状。

  

山山讲堂 Maya建模教程之电话建模
  使用Extrude命令进行挤压。

  

山山讲堂 Maya建模教程之电话建模 山山讲堂 Maya建模教程之电话建模 山山讲堂 Maya建模教程之电话建模 山山讲堂 Maya建模教程之电话建模
  重复上面的步骤,挤压出话筒部分。

  

山山讲堂 Maya建模教程之电话建模
  细分。

  

山山讲堂 Maya建模教程之电话建模
  制作电话线。这一部分比较难,但也比较简单。为什么这样说呢?如果你曾读过我前面的螺旋曲线教程的话,这里你只要写一个简单的MEL语言,就可实现我们想要的效果,如下图所示。

  

山山讲堂 Maya建模教程之电话建模
  然后用户使用Surfaces下的Extrude命令就可实现电话线的制作。

  

山山讲堂 Maya建模教程之电话建模
  今天换一个制作方法,我给大家提供专门制作电话线的脚本,这样更加方便快捷。

  global proc phoneCord1( string $curv, float $numLoops )

  {

   int $numCvs, $i;

   float $p, $min, $max, $angle, $uoff, $voff;

   string $exp_str, $crv, $p_on_c;

   int $cvsPerLoop = 4;   // We base the number of cvs on

   $numCvs = (int) ($numLoops+.5) * $cvsPerLoop;

   $crv = curve( "-d", 3, "-p", 0, 0, 0, "-k", 0, "-k", 0, "-k", 0 );

   $min = getAttr( $curv + ".min" );

   $max = getAttr( $curv + ".max" );

   // create a curve with the required number of cvs

   for( $i = 1; $i <= $numCvs; $i++ )

   {

   curve -a -p ((float)$i) 0 0 $crv ;

   }     // Add a loopOffset attribute to the spiral curve   addAttr -sn loff -ln loopOffset -dv 1.0 -min 0 -max 10 $crv;

   setAttr -keyable on ($crv + ".loopOffset");   for( $i = 0; $i <= $numCvs; $i++ )

   {

   $p = (float)$i/$numCvs;

   $angle = $p * $numLoops * 6.28;

   $uoff = -sin( $angle );

   $voff = cos( $angle );   // we set the offset to zero for the start and end cvs

   if( $i == 0    $i == $numCvs )

   {

   $uoff = 0;

   $voff = 0;

   }

   $p = $min + ($max -$min) * $p;

   // create a pointOnCurve node on the source curve

   $p_on_c = pointOnCurve( "-ch", 1, "-parameter", $p, $curv );   // Create an expression to position the spiral

   // cvs relative to the source curve using the

   // point, normal and tangent from the pointOnCurve node

   // A cross product is performed to give a vector perpendicular

   // to the normal and tangent. The 2D rotation is then mapped to

   // this vector and the normal.

   expression -s ("$u = " + $uoff + " * " + $crv + ".loff;\n"

   + "$v = " + $voff + " * " + $crv + ".loff;\n"

   + "$nx = " + $p_on_c + ".nnx;\n"

   + "$ny = " + $p_on_c + ".nny;\n"

   + "$nz = " + $p_on_c + ".nnz;\n"

   + "$tx = " + $p_on_c + ".ntx;\n"

   + "$ty = " + $p_on_c + ".nty;\n"

   + "$tz = " + $p_on_c + ".ntz;\n"

   + $crv + ".cp[" + $i + "].xv = " + $p_on_c

   + ".px + ($ny * $tz - $ty * $nz) * $u + $nx * $v;\n"

   + $crv + ".cp[" + $i + "].yv = " + $p_on_c

   + ".py + ($tx * $nz - $nx * $tz) * $u + $ny * $v;\n"

   + $crv + ".cp[" + $i + "].zv = " + $p_on_c

   + ".pz + ($nx * $ty - $tx * $ny) * $u + $nz * $v;\n");

   }    }  global proc xyphoneCord()

  {

  if ( `window -exists phoneCord` )

  deleteUI xyphoneCord;  window

  -maximizeButton false

  -resizeToFitChildren true

  -title "phoneCord"

  -iconName "phoneCord" xyphoneCord;

  columnLayout -columnAttach "both" 5 -rowSpacing 2 -columnWidth 210;

   intFieldGrp -label "number" -v1 50 -cal 1 "left" phoneCordnumber;

   button -label "select a curve,make cord" -c xymakecord;

  showWindow xyphoneCord;

  }

  global proc xymakecord()

  {

   int $cordnum = `intFieldGrp -q -v1 phoneCordnumber`;   string $curveselect[];

   $curveselect=`ls -sl`;

   phoneCord1 $curveselect[0] $cordnum;

   xyQuickTube;

  createAndAssignShader blinn "";  }  proc string tube( string $cs ) // (curve shape)

  {

  string $t[];  

  if (objExists($cs) && (nodeType($cs)=="nurbsCurve"))

  {

  string$c=`createNode makeNurbCircle -n "baseCircle1"`;

  string$s=`createNode subCurve -n "profileRange1"`;

  string$e=`createNode extrude`;

  string$r=`createNode nurbsSurface -n "tube1"`;

  

  setAttr -e -k 0 ($c+".normal");

  setAttr -e -k 0 ($c+".normalX");

  setAttr -e -k 0 ($c+".normalY");

  setAttr -e -k 0 ($c+".normalZ");

  setAttr -e -k 0 ($c+".centerZ");

   setAttr ($c+".radius") 0.1;

  setAttr ($s+".minValue") 0.0;

  setAttr ($s+".maxValue") 1.0;

  setAttr ($s+".relative") 1;  

  setAttr ($e+".extrudeType") 2;

  setAttr ($e+".useComponentPivot") 1;

  setAttr ($e+".useProfileNormal") 1;

  setAttr ($e+".fixedPath") 1;  setAttr -e -k 0 ($e+".directionX");

  setAttr -e -k 0 ($e+".directionY");

  setAttr -e -k 0 ($e+".directionZ");

  setAttr -e -k 0 ($e+".useComponentPivot");

  setAttr -e -k 0 ($e+".useProfileNormal");

  setAttr -e -k 0 ($e+".fixedPath");

  setAttr -e -k 0 ($e+".rotation");

  setAttr -e -k 0 ($e+".scale");

  setAttr -e -k 0 ($e+".length");

  

  connectAttr ($c+".outputCurve") ($e+".profile");

  connectAttr ($cs+".worldSpace") ($s+".inputCurve");

  connectAttr ($s+".outputCurve") ($e+".path");

  connectAttr ($e+".outputSurface") ($r+".create");

  $t=`listRelatives -pa -p $r`;

  }

  return($t[0]);

  }

  //

  // main procedure

  //

  //

  global proc xyQuickTube()

  {

  string $sl[]=`ls -sl`, $s, $r[];

  for($s in $sl)

  {

  string $sh[]=`listRelatives -pa -s $s`;

  if ($sh[0]!="") $r[size($r)]=tube($sh[0]);

  }

  select -r -ne $r;

  }

  用户执行该段代码后,会弹出窗口。

  

山山讲堂 Maya建模教程之电话建模
  用户选择一段曲线执行该命令,即可生成电话线。

  

山山讲堂 Maya建模教程之电话建模
  将所有部件进行装配。

  

山山讲堂 Maya建模教程之电话建模


三、山山讲堂 Maya建模教程之车轮建模 之:山山讲堂 Maya教程之建模自行车
我时常都会想起在校园中和她一起骑着自行车的情景,虽然此情此景不再,但作为纪念,今天我们就来制作一辆卡通自行车。

  我希望大家在学习的时候,能够抓住重点,学习核心的东西——建模技术,而不是拘泥于命令操作,甚至是我怎么操作你就怎么操作,这样就只学了些死的东西,最终不能应用于实践的,到头来,大脑空空,两手空空。

  作为一个完整的产品,自行车要涉及到很多parts,在这里我不能每一步都面面俱到,也不能把每一个parts都尽善尽美地表现,在此希望大家原谅。但是我相信,只要有足够的信心和毅力,就一定能够能够做出一副完整的作品来的。先来看一下最终效果吧:

  

山山讲堂 Maya建模教程之自行车建模
  将复杂模型进行分解制作:

  1 制作车轮

  2 制作车把、车架

  3 制作车座

  4 制作车链

  首先我们制作轮胎,先简后易嘛。创建一个Torus。

  

山山讲堂 Maya建模教程之自行车建模
  调整参数,如下图所示。

  

山山讲堂 Maya建模教程之自行车建模 山山讲堂 Maya建模教程之自行车建模
  制作车轴。创建一个Cylinder,并修改参数如下。

  

山山讲堂 Maya建模教程之自行车建模
山山讲堂 Maya建模教程之自行车建模 山山讲堂 Maya建模教程之自行车建模
  使用“Insert Edge Loop Tool”工具添加环线。

  

山山讲堂 Maya建模教程之自行车建模
  使用Extrude命令进行挤压。

  

山山讲堂 Maya建模教程之自行车建模
  执行“Bevel”倒角命令,使其光滑。

  

山山讲堂 Maya建模教程之自行车建模
  制作一个下图所示的物体。

  

山山讲堂 Maya建模教程之自行车建模
  使用“Extrude”命令进行挤压。

  

山山讲堂 Maya建模教程之自行车建模
  执行“Bevel”倒角命令,使其光滑。

  

山山讲堂 Maya建模教程之自行车建模
  制作车圈。使用“Create Polygon Tool”工具创造车圈截面。

  

山山讲堂 Maya建模教程之自行车建模
  创建一个圆(最好将其打断,方便后续操作)。选择下图所示的线和圆,执行Extrude命令。注意:千万不要多选线,否则形成封闭形状。

  

山山讲堂 Maya建模教程之自行车建模
  
山山讲堂 Maya建模教程之自行车建模
  如上图所示,正常情况下只有1个分段,所以我们什么也没看到。在历史记录中修改Divisions参数为30。

  

山山讲堂 Maya建模教程之自行车建模
  为更好观察,我们用材质进行简单的模型区分,并将它们打组。

  

山山讲堂 Maya建模教程之自行车建模
下图所展示的这一部分非常简单,我省去不作演示。

  

山山讲堂 Maya建模教程之自行车建模
  下面我们来制作车把。用户创建下图所示的线和面,并选择线和面执行挤压命令。

  

山山讲堂 Maya建模教程之自行车建模 山山讲堂 Maya建模教程之自行车建模
  修改段数为合适数值。

  

山山讲堂 Maya建模教程之自行车建模
  使用Mirror Geometry命令进行复制。

  

山山讲堂 Maya建模教程之自行车建模
  使用Extrude命令做出把手部分。

  

山山讲堂 Maya建模教程之自行车建模
  下面来制作大梁部分。创建一个Cylinder,并改它的段数为10,并缩放到合理大小。

  

山山讲堂 Maya建模教程之自行车建模 山山讲堂 Maya建模教程之自行车建模
  使用“Insert Edge Loop Tool”工具添加环线。

  

山山讲堂 Maya建模教程之自行车建模
  使用Extrude命令进行挤压。

  

山山讲堂 Maya建模教程之自行车建模
  使用“Delete Edge/Vertex”删除圆柱顶面的犄点。

  

山山讲堂 Maya建模教程之自行车建模 山山讲堂 Maya建模教程之自行车建模
  使用“Split Polygon Tool”添加线。

  

山山讲堂 Maya建模教程之自行车建模
  删除选中的面。

  

山山讲堂 Maya建模教程之自行车建模 山山讲堂 Maya建模教程之自行车建模
  使用“Append To Polygon Tool”工具封住缺口。

  

山山讲堂 Maya建模教程之自行车建模
  缩放两条边。

  

山山讲堂 Maya建模教程之自行车建模
  添加线,继续调整,最终效果如图。

  

山山讲堂 Maya建模教程之自行车建模
  其他横梁和连接件均可采用此方法制作,在此我不做详细解释。

  制作车辆上的弹簧,除了能够减震,还能够起到装饰效果。使用Create>Polygon Primitives>Helix创建弹簧。

  

山山讲堂 Maya建模教程之自行车建模
  修改弹簧的历史记录。

  

山山讲堂 Maya建模教程之自行车建模 山山讲堂 Maya建模教程之自行车建模
制作车座。创建一个Cube,修改其历史记录如下图。

  

山山讲堂 Maya建模教程之自行车建模 山山讲堂 Maya建模教程之自行车建模 山山讲堂 Maya建模教程之自行车建模
  调整点的位置。

  

山山讲堂 Maya建模教程之自行车建模
  在这里我省去脚蹬部分的制作。我制作的也比较简单,用户可参考其他教程制作得精细一些。

  

山山讲堂 Maya建模教程之自行车建模
  下面重点讲解一下链条和轮盘的制作。

  先制作轮盘。创建一个圆柱体,缩放,并修改历史记录。

  

山山讲堂 Maya建模教程之自行车建模
山山讲堂 Maya建模教程之自行车建模 山山讲堂 Maya建模教程之自行车建模
  删除面。

  

山山讲堂 Maya建模教程之自行车建模
  使用命令进行挤压。

  

山山讲堂 Maya建模教程之自行车建模
  在“keep faces together”关闭的情况下,选择下图所示的面进行挤压。

  

山山讲堂 Maya建模教程之自行车建模
  继续选择下图所示的面进行挤压。

  

山山讲堂 Maya建模教程之自行车建模
  制作链条。用户先制作出一个cell,如下图所示。为了节省时间,我制作的是低精度模型。

  

山山讲堂 Maya建模教程之自行车建模
  使用“Duplicate Special”中的“Smart Transform”方式进行复制。

  

山山讲堂 Maya建模教程之自行车建模
  选择所有的链条部件执行Combine命令。

  选择执行过Combine后的物体,然后创建“blend”变形(动画模块下的Create Deformers>Nolinear>blend),形成我们需要的链条形状。

  

山山讲堂 Maya建模教程之自行车建模
  最终链条效果。

  

山山讲堂 Maya建模教程之自行车建模
  组装后,看看我们制作的自行车最终效果吧。

  

山山讲堂 Maya建模教程之自行车建模
标签:建模   讲堂   车轮   山山   教程