A-A+

山山讲堂 Maya教程之建模自行车

2017-06-09 互动内容
一、山山讲堂 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建模教程之自行车建模


二、山山讲堂 Maya教程之建模自行车 之:山山讲堂 Maya建模教程之手机建模
大家先来看看最终的效果吧:

  

山山讲堂 Maya建模教程之手机建模
  根据手机结构,大体先划分一下制作流程:

  1 制作上机盖

  2 制作机托

  3 制作电池

  4 制作按键

  创建一个Cube,具体参数如下。

  

山山讲堂 Maya建模教程之手机建模
  
山山讲堂 Maya建模教程之手机建模 山山讲堂 Maya建模教程之手机建模
  调点。

  

山山讲堂 Maya建模教程之手机建模
  使用Insert Edge Loop Tool工具添加环线。

  

山山讲堂 Maya建模教程之手机建模
  调点。

  

山山讲堂 Maya建模教程之手机建模
  使用Extrude命令挤压。

  

山山讲堂 Maya建模教程之手机建模
  加线,调点。

  

山山讲堂 Maya建模教程之手机建模
  细分。

  

山山讲堂 Maya建模教程之手机建模
  大家可以看到很多细节被圆滑过渡了,所以要使用Split Polygon Tool和Insert Edge Loop Tool添加线保留细节。

  

山山讲堂 Maya建模教程之手机建模
  细分后的效果。

  

山山讲堂 Maya建模教程之手机建模
  选择如下图所示的面。

  

山山讲堂 Maya建模教程之手机建模
  使用Duplicat Face命令复制面。

  

山山讲堂 Maya建模教程之手机建模
  使用Extrude进行挤压。

  

山山讲堂 Maya建模教程之手机建模
  
山山讲堂 Maya建模教程之手机建模
  
山山讲堂 Maya建模教程之手机建模
  简单调整点之后效果。

  

山山讲堂 Maya建模教程之手机建模
  细分。

  

山山讲堂 Maya建模教程之手机建模
  为了保留细节,添加线。

  

山山讲堂 Maya建模教程之手机建模
  细分。

  

山山讲堂 Maya建模教程之手机建模
  将以上两部分装配起来,发现手机的翻盖部分已经完成了。

  

山山讲堂 Maya建模教程之手机建模
创建一个Cube,具体参数如下。

  

山山讲堂 Maya建模教程之手机建模
  
山山讲堂 Maya建模教程之手机建模
  添加环线,调点。

  

山山讲堂 Maya建模教程之手机建模
  
山山讲堂 Maya建模教程之手机建模
  使用Extrude命令挤压。

  

山山讲堂 Maya建模教程之手机建模
  
山山讲堂 Maya建模教程之手机建模
  
山山讲堂 Maya建模教程之手机建模
  制作接缝。

  

山山讲堂 Maya建模教程之手机建模
  
山山讲堂 Maya建模教程之手机建模
  添加线,保留细节,最终细分后,效果如下图。

  

山山讲堂 Maya建模教程之手机建模
  至于剩余的孔、洞,用户可以采用布尔运算来制作,进行装配后的效果。

  

山山讲堂 Maya建模教程之手机建模
  由于剩下的零部件都非常简单,建模思路也大同小异,在此不作详细讲述。

  

山山讲堂 Maya建模教程之手机建模
  
山山讲堂 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建模教程之电话建模
标签:讲堂   建模   山山   自行车   教程