Hello, I’m a new Urho3d user. I’m developing with lua bindings, and so far so good.
However, I’m having trouble with constraints. What I’m trying to make is a “creature,” made up of various rigid bodies. It’s randomly generated, and I’m using impulses to make it move. The problem I have is that it is floppy no matter what I do. Hinge joints with strictly low limits don’t seem to limit at all. Also, point constraints seem to have the same affect.
I tried messing with the axis, lower and upper limits, and switching between Hinge and Point constraints. I’m assuming Point constraint means “weld joint”? Or, is there a weld joint/constraint somewhere else that I’m missing?
I’d love to be able to weld bodies together, and also to be able to limit hinges properly, so that I can make natural “knee” and “elbow” movements. Right now, it just tumbles to the floor and everything is freely spinning, rotating, and moving.
Here is a relevant sample code from a “part” of the creature. A for loop creates 5,10 of these and joins them randomly. So they all more or less will have similar controls.
guy[i].partNode = scene_:CreateChild() guy[i].partNode.scale = Vector3(sx,sy,sz) guy[i].partNode.position=Vector3(posx,posy,posz) guy[i].posx=posx guy[i].posy=posy guy[i].posz=posz guy[i].sx=sx guy[i].sy=sy guy[i].sz=sz guy[i].dirx=dirx guy[i].diry=diry guy[i].dirz=dirz guy[i].partObject = guy[i].partNode:CreateComponent("StaticModel") guy[i].partBody = guy[i].partNode:CreateComponent("RigidBody") guy[i].partShape = guy[i].partNode:CreateComponent("CollisionShape") guy[i].partConstraint = guy[i].partNode:CreateComponent("Constraint") guy[i].partObject.model = cache:GetResource("Model", "Models/Box.mdl") guy[i].color=RandomInt(1,4) guy[i].partObject.material = mat[guy[i].color] guy[i].partObject.castShadows = true guy[i].partShape:SetBox(Vector3(sx,sy,sz)) guy[i].partBody.friction = 1 guy[i].partBody.mass = (sx*sy*sz)/set.massFac guy[i].partBody.linearDamping = 0.2 guy[i].partBody.angularDamping = 0.2 guy[i].partBody.collisionLayer = 1 guy[i].partBody:SetCcdMotionThreshold(1) guy[i].partBody:SetCcdRadius(1) guy[i].partBody.collisionEventMode = COLLISION_ALWAYS guy[i].whichjoint=RandomInt(0,1) if guy[i].whichjoint==1 then guy[i].partConstraint.constraintType = CONSTRAINT_HINGE else guy[i].partConstraint.constraintType = CONSTRAINT_POINT end guy[i].partConstraint.otherBody = guy[connect].partNode:GetComponent("RigidBody") guy[i].partConstraint.worldPosition = Vector3(jposx,jposy,jposz) guy[i].axis1=Random(1.0) guy[i].axis2=Random(1.0) guy[i].axis3=Random(1.0) while math.abs(guy[i].axis1+guy[i].axis2+guy[i].axis3)>1 do guy[i].axis1=Random(1.0) guy[i].axis2=Random(1.0) guy[i].axis3=Random(1.0) end guy[i].lowlim1=Random(180.0)*-1 guy[i].lowlim2=Random(180.0)*-1 guy[i].uplim1=Random(180.0) guy[i].uplim2=Random(180.0) guy[i].partConstraint.axis = Vector3(guy[i].axis1, guy[i].axis2, guy[i].axis3) guy[i].partConstraint.lowLimit = Vector2(guy[i].lowlim1, guy[i].lowlim2) guy[i].partConstraint.highLimit = Vector2(guy[i].uplim1,guy[i].uplim2) guy[i].partConstraint.disableCollision = false
*Please excuse gutter-formatting
Yes, the parameters of the constraint are randomly applied here, but it doesn’t matter if I set all the axis to 1 or 0, or the lower/upper limits to 0 or 180. It’s all the same floppy mess in the end. That said, they are connected, and I have no problem creating the constraint, they just are weak and not restricted in movement. They stretch and pull apart easily.
Any help with this would be greatly appreciated, as I’m scratching my head on this one. I’m sure I must be missing something.