// Author: Owen Merrick // Date: 2008 03 11 // Description: Congestion simulation // Spheres move along paths at a speed which depends upon the proximity of their neighbors // Based on the LA freeways int $numClumps = 1; // Parameters for initial setup int $numCarsPerClump = 20; int $numFrames = 15; // STARTS OUT BY DELETING EVERYTHING!!!!!!!!!! select -all; delete; camera -n "perspCam1" -centerOfInterest 5 -focalLength 35 -lensSqueezeRatio 1 -cameraScale 1 -horizontalFilmAperture 1.4173 -horizontalFilmOffset 0 -verticalFilmAperture 0.9449 -verticalFilmOffset 0 -filmFit Fill -overscan 1 -motionBlur 0 -shutterAngle 144 -nearClipPlane 0.01 -farClipPlane 1000 -orthographic 0 -orthographicWidth 30; objectMoveCommand; cameraMakeNode 2 ""; setAttr "perspCam1Shape1.backgroundColor" -type double3 0.9 0.9 0.9 ; //addAttr -longName parameterPosition -at "float" -defaultValue 0 -minValue 0 -maxValue 1; // xform -t 165 7.5 64; // Set up materials float $red = .25; for ($iii=1;$iii<5;$iii++){ string $owenblinn = "owenredblinn"+$iii; string $owenblinnSG = "owenredblinn"+$iii+"SG"; string $owenblinnoutcolor = "owenredblinn"+$iii+".outColor"; string $owenblinnSGsS = "owenredblinn"+$iii+"SG.surfaceShader"; string $owenblinncolor = "owenredblinn"+$iii+".color"; string $owenblinnincand = "owenredblinn"+$iii+".incandescence"; shadingNode -asShader blinn -n $owenblinn; renderCreateBarCB -asShader "surfaceShader" blinn; sets -renderable true -noSurfaceShader true -empty -name $owenblinnSG; connectAttr -f $owenblinnoutcolor $owenblinnSGsS; setAttr $owenblinncolor -type double3 $red 0 0 ; setAttr $owenblinnincand -type double3 $red 0 0 ; $red = $red+.25; } float $yel = .4; for ($iii=1;$iii<5;$iii++){ string $owenblinn = "owenyellowblinn"+$iii; string $owenblinnSG = "owenyellowblinn"+$iii+"SG"; string $owenblinnoutcolor = "owenyellowblinn"+$iii+".outColor"; string $owenblinnSGsS = "owenyellowblinn"+$iii+"SG.surfaceShader"; string $owenblinncolor = "owenyellowblinn"+$iii+".color"; string $owenblinnincand = "owenyellowblinn"+$iii+".incandescence"; shadingNode -asShader blinn -n $owenblinn; renderCreateBarCB -asShader "surfaceShader" blinn; sets -renderable true -noSurfaceShader true -empty -name $owenblinnSG; connectAttr -f $owenblinnoutcolor $owenblinnSGsS; setAttr $owenblinncolor -type double3 $yel $yel 0 ; setAttr $owenblinnincand -type double3 $yel $yel 0 ; $yel = $yel+.07; } string $filename = "traffix"; setAttr defaultRenderGlobals.imageFilePrefix -type "string" $filename; setAttr defaultRenderGlobals.enableDefaultLight 1; //turn on default lights setAttr defaultRenderGlobals.extensionPadding 3; // Create Freeway network curves: curve -n "FWYsantaMonica" -d 3 -p 6.449833 56.113778 0.5 -p 38.877096 79.629732 -7 -p 79.720594 40.766524 2 -p 131.208156 93.491767 2.5 -p 172.794264 77.649441 9 -k 0 -k 0 -k 0 -k 1 -k 2 -k 2 -k 2 ; curve -n "FWYhollywood" -d 3 -p 0.0138882 118.740476 2 -p 45.313041 123.443666 19 -p 73.532186 74.679004 -18 -p 124.772211 62.797259 5 -p 138.881783 27.399561 -2 -k 0 -k 0 -k 0 -k 1 -k 2 -k 2 -k 2 ; curve -n "FWYpasadena" -d 3 -p 120.811629 101.165394 -16 -p 62.640586 88.788577 13 -p 79.225522 40.023915 -12 -p 74.769867 5.863898 14 -k 0 -k 0 -k 0 -k 1 -k 1 -k 1 ; // curve -n "FWYsanDiego" -d 3 -p 14.618533 133.592657 8 -p 18.084042 103.640758 12 -p 10.410415 77.649441 0 -p 59.917686 45.469715 -7 -p 42.590141 18.240715 5 -p 54.719423 5.121289 0 -k 0 -k 0 -k 0 -k 1 -k 2 -k 3 -k 3 -k 3 ; // curve -n "FWYimperial" -d 3 -p 42.660286 24.070244 2 -p 68.793464 34.634721 10 -p 103.452361 12.579059 2 -p 134.404423 22.031486 -2 -k 0 -k 0 -k 0 -k 1 -k 1 -k 1 ; select "FWY*"; string $FWYS[] = `ls-sl`; // FWYS[] = strings of freeway names int $szFWYS = size($FWYS); // $szFWYS = # of freeways hide "FWY*"; // $cvLength[] = freeway lengths in parameter space int $cvLength[]; for ($i=0; $i < $szFWYS; $i++){ string $crap[] =`listHistory $FWYS[$i]`; $cvLength[$i] = `getAttr ($crap[0]+".spans")`; } // Create initial setup // Place cars on the road, normally distributed along the path float $a, $b, $c, $z, $aa, $bb, $cc, $zz; string $thiscar; string $All[]; clear $All; for ($l = 0; $l < $szFWYS ; $l++){ // loop through each road for($lll = 0; $lll <= $numClumps;$lll++){ // $clumpMean = rand(.2,.8); for($i=1;$i<$numCarsPerClump;$i++){ do{ $a = rand(-1,1); $b = rand(-1,1); $z = (($a*$a)+($b*$b)); }while($z == 0 || $z >= 1); do{ $aa = rand(-1,1); $bb = rand(-1,1); $zz = (($aa*$aa)+($bb*$bb)); }while($zz == 0 || $zz >= 1); $z = sqrt((-2*log($z))/$z); $zz = sqrt((-2*log($zz))/$zz); $randX = $a*$z*.6; $randY = $b*$z*.6; $randZ = $aa*$zz*.8; $randU = ((($bb*$zz)/35)+$clumpMean); if ($randU < 0 || $randU > 1){ $randU = $clumpMean; } sphere -r .75 -n "car"; string $curCar[] = `ls-sl`; addAttr -longName parameterPosition -at "float" -defaultValue $randU -minValue 0 -maxValue 1; addAttr -longName currentFWY -at short -defaultValue $l; string $carHist[] = `listHistory $curCar[0]`; float $pocVals[] = `pointOnCurve -top 1 -pr $randU -p $FWYS[$l]`; setAttr ($carHist[1]+".pivot") -type "double3" $pocVals[0] $pocVals[1] $pocVals[2]; setAttr ($curCar[0]+".translate") -type "double3" $randX $randY $randZ ; } } } // End of initial setup // create an array of car names: select `ls -tr`; string $deselect[] = {"perspCam1_group","perspCam1","perspCam1_aim","front", "persp", "side", "top", "FWYhollywood", "FWYpasadena", "FWYsantaMonica"}; // string $deselect[] = {"front", "persp", "side", "top", "FWYhollywood", "FWYimperial", "FWYpasadena", "FWYsanDiego", "FWYsantaMonica"}; select -d $deselect; string $All[] = `ls-sl`; int $sizeAll = size($All); string $closest; string $closest2; string $closest3; // for ($pp = 1; $pp < $numFrames ;$pp++){ // turn on for normal animation float $camU=0 do{ for ($k = 0; $k < $sizeAll; $k++){ // find distance to nearest neighbor (approximate congestion) // then move along by some factor of distance to neighbor (or 3 closest) float $XYZVals01[] = `getAttr ($All[$k] + ".center")` ; vector $XYZVec01 = <<$XYZVals01[0], $XYZVals01[1], $XYZVals01[2]>> ; float $previousD = 1000000000; float $closestDist = 1000000; float $closest2Dist = 99999999; float $closest3Dist = 99999998; // Find distances to nearest 3 neighbors for ($n = 0; $n < $sizeAll; $n++){ float $XYZVals02[] = `getAttr ($All[$n] + ".center")` ; vector $XYZVec02 = <<$XYZVals02[0], $XYZVals02[1], $XYZVals02[2]>> ; $DiffVec = $XYZVec01 - $XYZVec02 ; float $CurrentDist = mag($DiffVec); if ($CurrentDist < $previousD && $CurrentDist != 0){ // $closest = $All[$n]; $closestDist = $CurrentDist; $previousD = $CurrentDist; }; if ($CurrentDist < $closest2Dist && $CurrentDist > $closestDist){ // $closest2 = $All[$n]; $closest2Dist = $CurrentDist; }; if ($CurrentDist < $closest3Dist && $CurrentDist > $closest2Dist){ // $closest3 = $All[$n]; $closest3Dist = $CurrentDist; }; }; // print ($All[$k]+ " : " + $closest + " : "+ $closestDist + "\n"); // print ("second: "+ $closest2 + " : " +$closest2Dist + "\n"); // print ("third: "+ $closest3 + " : " +$closest3Dist + "\n\n"); float $deltaU = ($closestDist + $closest2Dist + $closest3Dist)/5000; if ($deltaU > .007){ $deltaU = .06 + rand(-.001, .002); } float $oldU = `getAttr ($All[$k]+".parameterPosition")`; float $newU = ($oldU + $deltaU); if ($newU > 1){ do{ $newU = $newU - 1; }while($newU > 1); } int $curCarFwy = `getAttr ($All[$k]+".currentFWY")`; float $pocVals[] = `pointOnCurve -top 1 -pr $newU -p $FWYS[$curCarFwy]`; string $carHist[] = `listHistory $All[$k]`; setAttr ($carHist[1]+".pivot") -type "double3" $pocVals[0] $pocVals[1] $pocVals[2]; setAttr ($All[$k]+".parameterPosition") $newU; select -r $All[$k]; if ( $deltaU > .005) {sets -e -forceElement owenyellowblinn2SG;} else if ( $deltaU <= .005 && $deltaU > .002 ) {sets -e -forceElement owenyellowblinn1SG;} else if ( $deltaU <= .002 && $deltaU > .0011 ) {sets -e -forceElement owenredblinn1SG;} else if ( $deltaU <= .0011 && $deltaU > .0009 ) {sets -e -forceElement owenredblinn2SG;} else if ( $deltaU <= .0009&& $deltaU > .0007 ) {sets -e -forceElement owenredblinn3SG;} else {sets -e -forceElement owenredblinn4SG;} }; // Send a camera along the road // find distance to nearest neighbor (approximate congestion) // then move along by some factor of distance to neighbor (or 3 closest) float $XYZVals01[] = `getAttr "perspCam1.center"` ; vector $XYZVec01 = <<$XYZVals01[0], $XYZVals01[1], $XYZVals01[2]>> ; float $previousD = 1000000000; float $closestDist = 1000000; float $closest2Dist = 99999999; float $closest3Dist = 99999998; // Find distances to nearest 3 neighbors for ($n = 0; $n < $sizeAll; $n++){ float $XYZVals02[] = `getAttr ($All[$n] + ".center")` ; vector $XYZVec02 = <<$XYZVals02[0], $XYZVals02[1], $XYZVals02[2]>> ; $DiffVec = $XYZVec01 - $XYZVec02 ; float $CurrentDist = mag($DiffVec); if ($CurrentDist < $previousD && $CurrentDist != 0){ // $closest = $All[$n]; $closestDist = $CurrentDist; $previousD = $CurrentDist; }; if ($CurrentDist < $closest2Dist && $CurrentDist > $closestDist){ // $closest2 = $All[$n]; $closest2Dist = $CurrentDist; }; if ($CurrentDist < $closest3Dist && $CurrentDist > $closest2Dist){ // $closest3 = $All[$n]; $closest3Dist = $CurrentDist; }; }; // print ($All[$k]+ " : " + $closest + " : "+ $closestDist + "\n"); // print ("second: "+ $closest2 + " : " +$closest2Dist + "\n"); // print ("third: "+ $closest3 + " : " +$closest3Dist + "\n\n"); float $deltaU = ($closestDist + $closest2Dist + $closest3Dist)/5000; if ($deltaU > .007){ $deltaU = .06 + rand(-.001, .002); } // float $oldU = `getAttr "perspCam1.parameterPosition"`; $camU = $camU + $deltaU; // int $curCarFwy = `getAttr ($All[$k]+".currentFWY")`; float $aimU = $camU + 0.005; float $pocVals[] = `pointOnCurve -top 1 -pr $camU -p $FWYS[1]`; // Set # for camera path float $aimVals[] = `pointOnCurve -top 1 -pr $aimU -p $FWYS[1]`; // Set # for camera path setAttr "perspCam1.translate" -type "double3" $pocVals[0] $pocVals[1] $pocVals[2]; setAttr "perspCam1_aim.translate" -type "double3" $aimVals[0] $aimVals[1] $aimVals[2]; // setAttr ($All[$k]+".parameterPosition") $newU; // float $car54vals[] = `getAttr car54.center`; // xform -t $car54vals[0] $car54vals[1] $car54vals[2] perspCam1_aim; // render perspCam1; // render top; currentTime $pp; // } // turn on to end For = numframes } while($camU < 1); // use with camera pathway