Josh Posted March 6, 2021 Share Posted March 6, 2021 Okay, so when your ragdoll is initialized, it appears the self.mHead, self.mStomach, etc. are all positioned and rotated at (0,0,0). I think. You need to set these to the starting position of the visual model, create joints, and then when the ragdoll is activated, position and rotate the ragdoll limbs to match the current orientation of the visual model. Scripts.zip Note the CreateJoints function is now using the position of the ragdoll limb, not the visual model. I might have disabled collisions between ragdoll limbs at some point using SetCollisionType, so you should re-enable this if wanted. Works perfectly, no changes to the engine are needed. 1 Quote My job is to make tools you love, with the features you want, and performance you can't live without. Link to comment Share on other sites More sharing options...
Yue Posted March 6, 2021 Author Share Posted March 6, 2021 The translator doesn't help me much, I'll create a simple articulation and I'll let you know. Quote Link to comment Share on other sites More sharing options...
Yue Posted March 6, 2021 Author Share Posted March 6, 2021 The first step, I built my monicker for a simple joint. Subsequently, I create rigid bodies for each bone. ( 2) Continue... Quote Link to comment Share on other sites More sharing options...
Yue Posted March 6, 2021 Author Share Posted March 6, 2021 All set to covet a single joint Continue... Quote Link to comment Share on other sites More sharing options...
Yue Posted March 6, 2021 Author Share Posted March 6, 2021 Recovering the bones of the monkey continue... Quote Link to comment Share on other sites More sharing options...
Yue Posted March 6, 2021 Author Share Posted March 6, 2021 Script.bodyHead = nil --Entity "Body Head" Script.bodyFoot = nil --Entity "Body Foot" Script.r = false function Script:Start() self.boneHead = self.entity:FindChild("Bone1") self.boneFoot = self.entity:FindChild("Bone2") System:Print(self.boneHead) System:Print(self.boneFoot) end function Script:UpdateWorld() if self.r == false then if Window:GetCurrent():KeyHit(Key.R) then self:SetPosition() self:SetRotation() end end end function Script:SetPosition() self.bodyHead:SetPosition(self.boneHead:GetPosition(true),true) self.bodyFoot:SetPosition(self.boneFoot:GetPosition(true),true) end function Script:SetRotation() self.bodyHead:SetRotation(self.boneHead:GetRotation(true),true) self.bodyFoot:SetRotation(self.boneFoot:GetRotation(true),true) end here I position the rigid bodies in the position and rotation of the bones. This should be sufficient for when the model is pointed elsewhere. The next step is to create the single joint. Continue... Quote Link to comment Share on other sites More sharing options...
Yue Posted March 6, 2021 Author Share Posted March 6, 2021 Script.bodyHead = nil --Entity "Body Head" Script.bodyFoot = nil --Entity "Body Foot" Script.r = false Script.joint = nil function Script:Start() self.boneHead = self.entity:FindChild("Bone1") self.boneFoot = self.entity:FindChild("Bone2") System:Print(self.boneHead) System:Print(self.boneFoot) end function Script:UpdateWorld() if self.r == false then if Window:GetCurrent():KeyHit(Key.R) then self:SetPosition() self:SetRotation() self:CreateJoint() self:SetMass(1.0) self.entity:Hide() end end --Rotate Player. if Window:GetCurrent():KeyDown(Key.A) then System:Print("Rotate") self.entity:SetRotation(0,-90,0) end end function Script:SetMass( mass ) self.bodyHead:SetMass( mass) self.bodyFoot:SetMass(mass) end function Script:CreateJoint() self.joint = Joint:Hinge(self.bodyHead:GetPosition(true).x, self.bodyHead:GetPosition(true).y, self.bodyHead:GetPosition(true).z, 1,0,0, self.bodyFoot, self.bodyHead) self.joint:EnableLimits() self.joint:SetLimits(0,90) end function Script:SetPosition() self.bodyHead:SetPosition(self.boneHead:GetPosition(true),true) self.bodyFoot:SetPosition(self.boneFoot:GetPosition(true),true) end function Script:SetRotation() self.bodyHead:SetRotation(self.boneHead:GetRotation(true),true) self.bodyFoot:SetRotation(self.boneFoot:GetRotation(true),true) end It's definitely not working, I don't know what the real problem is, I'm missing something I don't know what it is. I create the joint, but the hinge always runs in global mode, at least from my point of view, even if I rotate the monkey. Scripts folder open. Laboratorio.zip Quote Link to comment Share on other sites More sharing options...
Yue Posted March 6, 2021 Author Share Posted March 6, 2021 Script.bodyHead = nil --Entity "Body Head" Script.bodyFoot = nil --Entity "Body Foot" Script.r = false Script.joint = nil function Script:Start() self.boneHead = self.entity:FindChild("Bone1") self.boneFoot = self.entity:FindChild("Bone2") System:Print(self.boneHead) System:Print(self.boneFoot) end function Script:UpdateWorld() if self.r == false then if Window:GetCurrent():KeyHit(Key.R) then if self.joint then self.joint:Release() end self:SetPosition() self:SetRotation() self:CreateJoint() self:SetMass(1.0) --self.entity:Hide() end end --Rotate Player. if Window:GetCurrent():KeyHit(Key.G) then System:Print("Rotate") self.entity:SetRotation(0,-90,0) end if Window:GetCurrent():KeyDown(Key.Space) then self.bodyHead:AddForce(0,100,0) self.bodyFoot:AddForce(0,100,0) end end function Script:SetMass( mass ) self.bodyHead:SetMass( mass) self.bodyFoot:SetMass(mass) self.bodyHead:SetVelocity(0,1,0) self.bodyFoot:SetVelocity(0,1,0) end function Script:CreateJoint() self.joint = Joint:Hinge(self.bodyHead:GetPosition(true).x, self.bodyHead:GetPosition(true).y, self.bodyHead:GetPosition(true).z, 1,0,0, self.bodyFoot, self.bodyHead) --self.joint:EnableLimits() --self.joint:SetLimits(0,90) end function Script:SetPosition() self.bodyHead:SetPosition(self.boneHead:GetPosition(true),true) self.bodyFoot:SetPosition(self.boneFoot:GetPosition(true),true) end function Script:SetRotation() self.bodyHead:SetRotation(self.boneHead:GetRotation(true),true) self.bodyFoot:SetRotation(self.boneFoot:GetRotation(true),true) end I've turned this every which way, no matter what I do, the hinge revolves around the global coordinates, no matter what I turn the column that acts as a monicker for the ragdoll. Update Scripts. R key = activate ragdoll. Space key = add force to the bodies. G Key = Turn Player. ( only one turn ) ERagdoll.lua Quote Link to comment Share on other sites More sharing options...
Yue Posted March 6, 2021 Author Share Posted March 6, 2021 Test hera Joint HInge. Quote Link to comment Share on other sites More sharing options...
Josh Posted March 7, 2021 Share Posted March 7, 2021 The code I posted works. Your joints need to be created when the ragdoll limbs are in the default pose. Then you position and rotate the ragdoll limbs to match the animated model, and your joints will rotate correctly. 1 1 Quote My job is to make tools you love, with the features you want, and performance you can't live without. Link to comment Share on other sites More sharing options...
Yue Posted March 7, 2021 Author Share Posted March 7, 2021 15 hours ago, Josh said: The code I posted works. Your joints need to be created when the ragdoll limbs are in the default pose. Then you position and rotate the ragdoll limbs to match the animated model, and your joints will rotate correctly. I think if I spoke English, I would be a genius. I will give it a try. Hey and about SetPosition and SetRotation to recover the skeleton and animate it, any solution? Quote Link to comment Share on other sites More sharing options...
Yue Posted March 7, 2021 Author Share Posted March 7, 2021 I can't figure this out, it obviously doesn't work for me. Charrua makes this comment. Each joint has a number of parameters controlling its geometry. An example is the position of the balland- socket point for a ball-and-socket joint. The functions to set joint parameters all take global coordinates, not body-relative coordinates. A consequence of this is that the rigid bodies that a joint connects must be positioned correctly before the joint is attached. That is, when I create the joint, for example the hinge joint, I find three parameters, which refer to the axis that is used. self.joint = Joint:Hinge(self.bodyHead:GetPosition(true).x, self.bodyHead:GetPosition(true).y, self.bodyHead:GetPosition(true).z, 1,0,0, self.bodyFoot, self.bodyHead) The parameter 1,0,0, refers to the fact that I use the X axis for the rotation of the hinge, but in my case and I don't know what happens, it stays with the global coordinate. Now, if I put 0,1,0, it is the same with the global coordinate in the Y axis. Script.bodyHead = nil --Entity "Body Head" Script.bodyFoot = nil --Entity "Body Foot" Script.r = false Script.joint = nil function Script:Start() self.boneHead = self.entity:FindChild("Bone1") self.boneFoot = self.entity:FindChild("Bone2") self:SetPosition() self:SetRotation() end function Script:UpdateWorld() if self.r == false then if Window:GetCurrent():KeyHit(Key.R) then if self.joint then self.joint:Release() end self:SetPosition() self:SetRotation() self:CreateJoint() self:SetMass(1.0) --self.entity:Hide() end end --Rotate Player. if Window:GetCurrent():KeyHit(Key.G) then System:Print("Rotate") self.entity:SetRotation(0,-90,0) end if Window:GetCurrent():KeyDown(Key.Space) then self.bodyHead:AddForce(0,100,0) self.bodyFoot:AddForce(0,100,0) end end function Script:SetMass( mass ) self.bodyHead:SetMass( mass) self.bodyFoot:SetMass(mass) self.bodyHead:SetVelocity(0,1,0) self.bodyFoot:SetVelocity(0,1,0) end function Script:CreateJoint() self.joint = Joint:Hinge(self.bodyHead:GetPosition(true).x, self.bodyHead:GetPosition(true).y, self.bodyHead:GetPosition(true).z, 1,0,0, self.bodyFoot, self.bodyHead) --self.joint:EnableLimits() --self.joint:SetLimits(0,90) end function Script:SetPosition() self.bodyHead:SetPosition(self.boneHead:GetPosition(true),true) self.bodyFoot:SetPosition(self.boneFoot:GetPosition(true),true) end function Script:SetRotation() self.bodyHead:SetRotation(self.boneHead:GetRotation(true),true) self.bodyFoot:SetRotation(self.boneFoot:GetRotation(true),true) end But this does not work, if someone wants to try the simple project, and help me to understand this, I appreciate it very much. It's just a simple articulation. Mars.rar Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.