/// Make the ground mesh. void MakeGround(double groundY) { MeshGeometry3D groundMesh = new MeshGeometry3D(); const double dx = 15; const double dy = 1; const double dz = dx; Point3D corner = new Point3D(-dx / 2, groundY - dy, -dz / 2); groundMesh.AddBoxWrapped(corner, D3.XVector(dx), D3.YVector(dy), D3.ZVector(dz)); Point[] topCoords = { new Point(0.1, 0.1), new Point(0.1, 0.9), new Point(0.9, 0.9), new Point(0.9, 0.1), }; Point[] frontCoords = { new Point(0.0, 0.1), new Point(0.0, 0.9), new Point(0.1, 0.9), new Point(0.1, 0.1), }; Point[] leftCoords = { new Point(0.9, 0.0), new Point(0.1, 0.0), new Point(0.1, 0.1), new Point(0.9, 0.1), }; Point[] rightCoords = { new Point(0.1, 1.0), new Point(0.9, 1.0), new Point(0.9, 0.9), new Point(0.1, 0.9), }; Point[] backCoords = { new Point(1.0, 0.9), new Point(1.0, 0.1), new Point(0.9, 0.1), new Point(0.9, 0.9), }; Point[] bottomCoords = { new Point(0.9, 0.1), new Point(0.9, 0.9), new Point(0.1, 0.9), new Point(0.1, 0.1), }; groundMesh.AddBox(corner, D3.XVector(dx), D3.YVector(dy), D3.ZVector(dz), frontCoords, leftCoords, rightCoords, backCoords, topCoords, bottomCoords); _group.Children.Add(groundMesh.MakeModel(System.IO.Path.Combine(_resDir, @"rock.jpg"))); }
void rightKneeSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs <double> e) { _groupRightLowerLeg.Transform = D3.Rotate(-D3.XVector(), D3.Origin, rightKneeSlider.Value); }
void leftHipSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs <double> e) { _groupLeftUpperLeg.Transform = D3.Rotate(-D3.XVector(), D3.Origin, leftHipSlider.Value); }
void rightShoulderSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs <double> e) { _groupRightUpperArm.Transform = D3.Rotate(-D3.XVector(), D3.Origin, rightShoulderSlider.Value); }
/// Define the model. void DefineModelRobot() { Width = 450; Height = 700; // Axes. MeshExtensions.AddXAxis(_group, 15, 0.1); // red = x MeshExtensions.AddYAxis(_group, 12, 0.1); // green = y MeshExtensions.AddZAxis(_group, 15, 0.1); // blue = z MeshExtensions.AddOrigin(_group, 0.5); // black // Make the ground. const double groundY = -5; MakeGround(groundY); // Various robot dimensions. const double headR = 1.5; // Head radius. const double neckLen = headR; // Neck length. const double backLen = 3 * headR; // Back length. const double shouW = 3 * headR; // Shoulder width. const double uaLen = 2 * headR; // Upper arm length. const double laLen = 2 * headR; // Lower arm length const double hipsW = 2 * headR; // Hip width. const double ulLen = 2 * headR; // Upper leg length. const double llLen = 2 * headR; // Lower leg length. const double boneR = 0.3; // Bone radius. const double jointR = 0.4; // Joint radius. const double height = 2 * headR + neckLen + backLen + ulLen + llLen; const double headY = height - headR; // Distance from center of head to ground. Brush boneBrush = Brushes.PowderBlue; // This group represents the whole robot. _groupRobot = new Model3DGroup(); _group.Children.Add(_groupRobot); _groupRobot.Transform = new TranslateTransform3D(0, headY + groundY, 0); // Head. // Skull. MeshGeometry3D skullMesh = new MeshGeometry3D(); skullMesh.AddSphere(D3.Origin, headR, 20, 10, true); GeometryModel3D skullModel = skullMesh.MakeModel(boneBrush); // Nose. MeshGeometry3D noseMesh = new MeshGeometry3D(); Point3D noseCenter = new Point3D(0, 0, headR); Point3D[] nosePoints = G3.MakePolygonPoints(10, noseCenter, D3.XVector(headR * 0.2), D3.YVector(headR * 0.2)); Vector3D noseAxis = new Vector3D(0, 0, headR); noseMesh.AddConeFrustum(noseCenter, nosePoints, noseAxis, headR * 0.5); GeometryModel3D noseModel = noseMesh.MakeModel(Brushes.Orange); // Eyes and smile. MeshGeometry3D eyeMesh = new MeshGeometry3D(); Point3D eyeCenter = SphericalToCartesian(headR, -Math.PI * 0.2, Math.PI * 0.4); eyeMesh.AddSphere(eyeCenter, headR * 0.2, 10, 5, false); eyeCenter = SphericalToCartesian(headR, Math.PI * 0.2, Math.PI * 0.4); eyeMesh.AddSphere(eyeCenter, headR * 0.2, 10, 5, false); eyeCenter = SphericalToCartesian(headR, Math.PI * 0, Math.PI * 0.7); eyeMesh.AddSphere(eyeCenter, headR * 0.1, 10, 5, false); eyeCenter = SphericalToCartesian(headR, Math.PI * 0.1, Math.PI * 0.67); eyeMesh.AddSphere(eyeCenter, headR * 0.1, 10, 5, false); eyeCenter = SphericalToCartesian(headR, -Math.PI * 0.1, Math.PI * 0.67); eyeMesh.AddSphere(eyeCenter, headR * 0.1, 10, 5, false); eyeCenter = SphericalToCartesian(headR, Math.PI * 0.15, Math.PI * 0.6); eyeMesh.AddSphere(eyeCenter, headR * 0.1, 10, 5, false); eyeCenter = SphericalToCartesian(headR, -Math.PI * 0.15, Math.PI * 0.6); eyeMesh.AddSphere(eyeCenter, headR * 0.1, 10, 5, false); GeometryModel3D eyeModel = eyeMesh.MakeModel(Brushes.Black); // Hat. MeshGeometry3D hatMesh = new MeshGeometry3D(); Point3D hatCenter = new Point3D(0, headR * 0.75, 0); hatMesh.AddSphere(hatCenter, headR * 0.75, 20, 10, true); const double hatR = headR * 1.2; Point3D[] hatPgon = G3.MakePolygonPoints(20, hatCenter, D3.XVector(hatR), D3.ZVector(hatR)); hatMesh.AddCylinder(hatPgon, D3.YVector(-0.2), true); GeometryModel3D hatModel = hatMesh.MakeModel(Brushes.SaddleBrown); // Head groups. _groupHead = JoinBones(_groupRobot, null); _groupHead.Children.Add(skullModel); _groupHead.Children.Add(noseModel); _groupHead.Children.Add(eyeModel); _groupHead.Children.Add(hatModel); // Neck. MeshGeometry3D neckMesh = new MeshGeometry3D(); Point3D[] neckPgon = G3.MakePolygonPoints(10, D3.Origin, D3.XVector(boneR), D3.ZVector(boneR)); neckMesh.AddCylinder(neckPgon, D3.YVector(-neckLen), true); GeometryModel3D neckModel = neckMesh.MakeModel(boneBrush); _groupNeck = JoinBones(_groupHead, new TranslateTransform3D(0, -headR, 0)); _groupNeck.Children.Add(neckModel); // Shoulders. MeshGeometry3D shoulderMesh = new MeshGeometry3D(); Point3D[] shouldersPgon = G3.MakePolygonPoints(10, new Point3D(-shouW / 2, 0, 0), D3.ZVector(boneR), D3.YVector(-boneR)); shoulderMesh.AddCylinder(shouldersPgon, D3.XVector(shouW), true); GeometryModel3D shoulderModel = shoulderMesh.MakeModel(boneBrush); _groupShoulder = JoinBones(_groupNeck, new TranslateTransform3D(0, -neckLen, 0)); _groupShoulder.Children.Add(shoulderModel); // Left upper arm. MeshGeometry3D luArmMesh = new MeshGeometry3D(); luArmMesh.AddCylinder(neckPgon, D3.YVector(-uaLen), true); luArmMesh.AddSphere(D3.Origin, jointR, 10, 5, true); GeometryModel3D luArmModel = luArmMesh.MakeModel(boneBrush); _groupLeftUpperArm = JoinBones(_groupShoulder, new TranslateTransform3D(shouW / 2, 0, 0)); _groupLeftUpperArm.Children.Add(luArmModel); // Right upper arm. MeshGeometry3D ruArmMesh = new MeshGeometry3D(); ruArmMesh.AddCylinder(neckPgon, D3.YVector(-uaLen), true); ruArmMesh.AddSphere(D3.Origin, jointR, 10, 5, true); GeometryModel3D ruArmModel = ruArmMesh.MakeModel(boneBrush); _groupRightUpperArm = JoinBones(_groupShoulder, new TranslateTransform3D(-shouW / 2, 0, 0)); _groupRightUpperArm.Children.Add(ruArmModel); // Left lower arm. MeshGeometry3D llArmMesh = new MeshGeometry3D(); llArmMesh.AddCylinder(neckPgon, D3.YVector(-laLen), true); llArmMesh.AddSphere(D3.Origin, jointR, 10, 5, true); GeometryModel3D llArmModel = llArmMesh.MakeModel(boneBrush); _groupLeftLowerArm = JoinBones(_groupLeftUpperArm, new TranslateTransform3D(0, -uaLen, 0)); _groupLeftLowerArm.Children.Add(llArmModel); // Right lower arm. MeshGeometry3D rlArmMesh = new MeshGeometry3D(); rlArmMesh.AddCylinder(neckPgon, D3.YVector(-laLen), true); rlArmMesh.AddSphere(D3.Origin, jointR, 10, 5, true); GeometryModel3D rlArmModel = rlArmMesh.MakeModel(boneBrush); _groupRightLowerArm = JoinBones(_groupRightUpperArm, new TranslateTransform3D(0, -uaLen, 0)); _groupRightLowerArm.Children.Add(rlArmModel); // Back and hips. MeshGeometry3D backMesh = new MeshGeometry3D(); backMesh.AddCylinder(neckPgon, D3.YVector(-backLen), true); GeometryModel3D backModel = backMesh.MakeModel(boneBrush); MeshGeometry3D hipsMesh = new MeshGeometry3D(); Point3D[] hipsPgon = G3.MakePolygonPoints(10, new Point3D(-hipsW / 2, -backLen, 0), D3.ZVector(boneR), D3.YVector(-boneR)); hipsMesh.AddCylinder(hipsPgon, D3.XVector(hipsW), true); GeometryModel3D hipsModel = hipsMesh.MakeModel(boneBrush); _groupBack = JoinBones(_groupNeck, new TranslateTransform3D(0, -neckLen, 0)); _groupBack.Children.Add(backModel); _groupBack.Children.Add(hipsModel); // Left upper leg. MeshGeometry3D luLegMesh = new MeshGeometry3D(); luLegMesh.AddCylinder(neckPgon, D3.YVector(-ulLen), true); luLegMesh.AddSphere(D3.Origin, jointR, 10, 5, true); GeometryModel3D luLegModel = luLegMesh.MakeModel(boneBrush); _groupLeftUpperLeg = JoinBones(_groupBack, new TranslateTransform3D(-hipsW / 2, -backLen, 0)); _groupLeftUpperLeg.Children.Add(luLegModel); // Right upper leg. MeshGeometry3D ruLegMesh = new MeshGeometry3D(); ruLegMesh.AddCylinder(neckPgon, D3.YVector(-ulLen), true); ruLegMesh.AddSphere(D3.Origin, jointR, 10, 5, true); GeometryModel3D ruLegModel = ruLegMesh.MakeModel(boneBrush); _groupRightUpperLeg = JoinBones(_groupBack, new TranslateTransform3D(hipsW / 2, -backLen, 0)); _groupRightUpperLeg.Children.Add(ruLegModel); // Left lower leg. MeshGeometry3D llLegMesh = new MeshGeometry3D(); llLegMesh.AddCylinder(neckPgon, D3.YVector(-llLen), true); llLegMesh.AddSphere(D3.Origin, jointR, 10, 5, true); GeometryModel3D llLegModel = llLegMesh.MakeModel(boneBrush); _groupLeftLowerLeg = JoinBones(_groupLeftUpperLeg, new TranslateTransform3D(0, -ulLen, 0)); _groupLeftLowerLeg.Children.Add(llLegModel); // Right lower leg. MeshGeometry3D rlLegMesh = new MeshGeometry3D(); rlLegMesh.AddCylinder(neckPgon, D3.YVector(-llLen), true); rlLegMesh.AddSphere(D3.Origin, jointR, 10, 5, true); GeometryModel3D rlLegModel = rlLegMesh.MakeModel(boneBrush); _groupRightLowerLeg = JoinBones(_groupRightUpperLeg, new TranslateTransform3D(0, -ulLen, 0)); _groupRightLowerLeg.Children.Add(rlLegModel); }