summaryrefslogtreecommitdiff
path: root/src/sims/prefabs/Ragdoll.scala
blob: ad5865316e0944b29c5c0b3240608d33eb7525f1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/*
 * Simple Mechanics Simulator (SiMS)
 * copyright (c) 2009 Jakob Odersky
 * made available under the MIT License
*/

package sims.prefabs

import sims.dynamics._
import sims.dynamics.joints._
import sims.geometry._

class Ragdoll(position: Vector2D) extends Prefab {
  val headTorso = new Body(new Circle(0.1, 1) {pos = position},
                           new Rectangle(0.09, 0.35, 1) {pos = position + Vector2D(0, -0.45)})
  val thigh1 = (new Rectangle(0.075, 0.17, 1) {pos = position + Vector2D(0, -0.97)}).asBody
  val thigh2 = (new Rectangle(0.075, 0.17, 1) {pos = position + Vector2D(0, -0.97)}).asBody
  val tibia1 = (new Rectangle(0.075, 0.25, 1) {pos = position + Vector2D(0, -1.39)}).asBody
  val tibia2 = (new Rectangle(0.075, 0.25, 1) {pos = position + Vector2D(0, -1.39)}).asBody
  val foot1 = (new Circle(0.08, 1) {pos = position + Vector2D(0, -1.72)}).asBody
  val foot2 = (new Circle(0.08, 1) {pos = position + Vector2D(0, -1.72)}).asBody
  val upperArm1 = (new Rectangle(0.17, 0.06, 1) {pos = position + Vector2D(0.17, -0.16)}).asBody
  val upperArm2 = (new Rectangle(0.17, 0.06, 1) {pos = position + Vector2D(-0.17, -0.16)}).asBody
  val forearm1 = (new Rectangle(0.15, 0.06, 1) {pos = position + Vector2D(0.49, -0.16)}).asBody
  val forearm2 = (new Rectangle(0.15, 0.06, 1) {pos = position + Vector2D(-0.49, -0.16)}).asBody
  val hand1 = (new Circle(0.07, 1) {pos = position + Vector2D(0.71, -0.16)}).asBody
  val hand2 = (new Circle(0.07, 1) {pos = position + Vector2D(-0.71, -0.16)}).asBody
  
  override val bodies = List(headTorso,
                             thigh1, thigh2,
                             tibia1, tibia2,
                             foot1, foot2,
                             upperArm1, upperArm2,
                             forearm1, forearm2,
                             hand1, hand2)
  private val shapes = bodies.flatMap(_.shapes)
  for (s <- shapes) s.transientShapes ++= shapes
  
  val shoulder1 = RevoluteJoint(headTorso, upperArm1, position + Vector2D(0, -0.16))
  val shoulder2 = RevoluteJoint(headTorso, upperArm2, position + Vector2D(0, -0.16))
  override val joints = List(shoulder1, shoulder2)

}