Jump to content
  • Advertisement

Search the Community

Showing results for tags 'Bullet'.

The search index is currently processing. Current results may not be complete.


More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Categories

  • Audio
    • Music and Sound FX
  • Business
    • Business and Law
    • Career Development
    • Production and Management
  • Game Design
    • Game Design and Theory
    • Writing for Games
    • UX for Games
  • Industry
    • Interviews
    • Event Coverage
  • Programming
    • Artificial Intelligence
    • General and Gameplay Programming
    • Graphics and GPU Programming
    • Engines and Middleware
    • Math and Physics
    • Networking and Multiplayer
  • Visual Arts
  • Archive

Categories

  • Audio
  • Visual Arts
  • Programming
  • Writing

Categories

  • Game Developers Conference
    • GDC 2017
    • GDC 2018
  • Power-Up Digital Games Conference
    • PDGC I: Words of Wisdom
    • PDGC II: The Devs Strike Back
    • PDGC III: Syntax Error

Forums

  • Audio
    • Music and Sound FX
  • Business
    • Games Career Development
    • Production and Management
    • Games Business and Law
  • Game Design
    • Game Design and Theory
    • Writing for Games
  • Programming
    • Artificial Intelligence
    • Engines and Middleware
    • General and Gameplay Programming
    • Graphics and GPU Programming
    • Math and Physics
    • Networking and Multiplayer
  • Visual Arts
    • 2D and 3D Art
    • Critique and Feedback
  • Community
    • GameDev Challenges
    • GDNet+ Member Forum
    • GDNet Lounge
    • GDNet Comments, Suggestions, and Ideas
    • Coding Horrors
    • Your Announcements
    • Hobby Project Classifieds
    • Indie Showcase
    • Article Writing
  • Affiliates
    • NeHe Productions
    • AngelCode
  • Topical
    • Virtual and Augmented Reality
    • News
  • Workshops
    • C# Workshop
    • CPP Workshop
    • Freehand Drawing Workshop
    • Hands-On Interactive Game Development
    • SICP Workshop
    • XNA 4.0 Workshop
  • Archive
    • Topical
    • Affiliates
    • Contests
    • Technical
  • GameDev Challenges's Topics
  • For Beginners's Forum

Calendars

  • Community Calendar
  • Games Industry Events
  • Game Jams
  • GameDev Challenges's Schedule

Blogs

There are no results to display.

There are no results to display.

Product Groups

  • GDNet+
  • Advertisements
  • GameDev Gear

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


About Me


Website


Role


Twitter


Github


Twitch


Steam

Found 19 results

  1. thecheeselover

    Unit Vision

    Subscribe to our subreddit to get all the updates from the team! First off, here's a video that shows the unit vision in action : So, what is the unit vision? It's a simple mechanism that notifies a unit when another unit enters its vision field. It also takes into account if the vision is blocked by entities. This is how it is implemented step by step : A cone ghost control is attached to the unit's head All units intersecting with the cone's AABB fire events (AABB because of how Bullet Physics work) Cast a ray towards the visible unit and then adjust the angle so that it fits in the cone If the ray cast touches the supposedly visible unit, then it is truly visible Using the debug view of Bullet Physics in the jMonkey Engine 3.1, we're able to see what the vision cone actually looks like. And when inside the cone we can't see it because of culling. However, we can see the enemy's arm moving, which is a test I did for when a unit see another unit. Behind a box, the enemy does not move its arm because he can't see me. But when I leave my hiding spot, he can see me again.
  2. Hi, I'm trying to fix physics in openrw. Actually we have two problems: - high velocity cars can clip through world geometry https://github.com/rwengine/openrw/issues/76 - weird work of suspension, actually we have tuned susp length, sitffness and max travel to make feel of riding maximal possibly real. But level of stiffness is to high. It's easy to flip vehicle. With reduced level of stiffness and optimal max travel; susp length, wheels are sinking. topic: https://github.com/rwengine/openrw/issues/416 two main files with physics : https://github.com/rwengine/openrw/blob ... stance.cpp https://github.com/rwengine/openrw/blob ... Object.cpp Example of problem: https://youtu.be/m87bJxE9hnU?t=2m50s I will be grateful for help. Btw. running openrw requires gta3 assets I have one steam key for gta if you want to try to test it.
  3. hello, I am trying to implement a realistic simulation of a roulette wheel. it is not clear for me what is the proper way to simulate the initial status of the ball, when it spins against the edge of the wheel until it loss energy and start falling towards the centre. I modelled the conic table as a height map, as I assume that would provide the smoother surface. but I see anyway there is rough squared corners everywhere, so really I don't have a smooth inner wall to slide against. I wonder if I should ignore the wall and simulate the sliding by code. i.e: apply force (or impulse?) each frame to keep the ball at a fixed radius and somehow force it to follow a desired angular speed.. later, when I want to execute the falling behaviour, just stop applying that forces and let the simulator and the gravity do their work.. makes sense? any advice is highly appreciated!
  4. In the Draw call, I just render all buffered vertices collected from the dynamics world, at the entry point of Draw, it always reporting empty buffers. I have setup the DXDebugDrawer correctly by deriving from the btIDebugDraw interface and I've made a call to the setDebugDrawer, how come it didn't work? if (m_dynamicsWorld) { m_dynamicsWorld->debugDrawWorld(); dynamic_cast(m_dynamicsWorld->getDebugDrawer())->Draw(); } thanks Jack
  5. Original Post: Limitless Curiosity Out of various phases of the physics engine. Constraint Resolution was the hardest for me to understand personally. I need to read a lot of different papers and articles to fully understand how constraint resolution works. So I decided to write this article to help me understand it more easily in the future if, for example, I forget how this works. This article will tackle this problem by giving an example then make a general formula out of it. So let us delve into a pretty common scenario when two of our rigid bodies collide and penetrate each other as depicted below. From the scenario above we can formulate: We don't want our rigid bodies to intersect each other, thus we construct a constraint where the penetration depth must be more than zero. \(C: d>=0\) This is an inequality constraint, we can transform it to a more simple equality constraint by only solving it if two bodies are penetrating each other. If two rigid bodies don't collide with each other, we don't need any constraint resolution. So: if d>=0, do nothing else if d < 0 solve C: d = 0 Now we can solve this equation by calculating \( \Delta \vec{p1},\Delta \vec{p2},\Delta \vec{r1}\),and \( \Delta \vec{r2}\) that cause the constraint above satisfied. This method is called the position-based method. This will satisfy the above constraint immediately in the current frame and might cause a jittery effect. A much more modern and preferable method that is used in Box2d, Chipmunk, Bullet and my physics engine is called the impulse-based method. In this method, we derive a velocity constraint equation from the position constraint equation above. We are working in 2D so angular velocity and the cross result of two vectors are scalars. Next, we need to find \(\Delta V\) or impulse to satisfy the velocity constraint. This \(\Delta V\) is caused by a force. We call this force 'constraint force'. Constraint force only exerts a force on the direction of illegal movement in our case the penetration normal. We don't want this force to do any work, contribute or restrict any motion of legal direction. \(\lambda\) is a scalar, called Lagrangian multiplier. To understand why constraint force working on \(J^{T}\) direction (remember J is a 12 by 1 matrix, so \(J^{T}\) is a 1 by 12 matrix or a 12-dimensional vector), try to remember the equation for a three-dimensional plane. Now we can draw similarity between equation(1) and equation(2), where \(\vec{n}^{T}\) is similar to J and \(\vec{v}\) is similar to V. So we can interpret equation(1) as a 12 dimensional plane, we can conclude that \(J^{T}\) as the normal of this plane. If a point is outside a plane, the shortest distance from this point to the surface is the normal direction. After we calculate the Lagrangian multiplier, we have a way to get back the impulse from equation(3). Then, we can apply this impulse to each rigid body. Baumgarte Stabilization Note that solving the velocity constraint doesn't mean that we satisfy the position constraint. When we solve the velocity constraint, there is already a violation in the position constraint. We call this violation position drift. What we achieve is stopping the two bodies from penetrating deeper (The penetration depth will stop growing). It might be fine for a slow-moving object as the position drift is not noticeable, but it will be a problem as the object moving faster. The animation below demonstrates what happens when we solve the velocity constraint. [caption id="attachment_38" align="alignnone" width="800"] So instead of purely solving the velocity constraint, we add a bias term to fix any violation that happens in position constraint. So what is the value of the bias? As mentioned before we need this bias to fix positional drift. So we want this bias to be in proportion to penetration depth. This method is called Baumgarte Stabilization and \(\beta\) is a baumgarte term. The right value for this term might differ for different scenarios. We need to tweak this value between 0 and 1 to find the right value that makes our simulation stable. Sequential Impulse If our world consists only of two rigid bodies and one contact constraint. Then the above method will work decently. But in most games, there are more than two rigid bodies. One body can collide and penetrate with two or more bodies. We need to satisfy all the contact constraint simultaneously. For a real-time application, solving all these constraints simultaneously is not feasible. Erin Catto proposes a practical solution, called sequential impulse. The idea here is similar to Project Gauss-Seidel. We calculate \(\lambda\) and \(\Delta V\) for each constraint one by one, from constraint one to constraint n(n = number of constraint). After we finish iterating through the constraints and calculate \(\Delta V\), we repeat the process from constraint one to constraint n until the specified number of iteration. This algorithm will converge to the actual solution.The more we repeat the process, the more accurate the result will be. In Box2d, Erin Catto set ten as the default for the number of iteration. Another thing to notice is that while we satisfy one constraint we might unintentionally satisfy another constraint. Say for example that we have two different contact constraint on the same rigid body. When we solve \(\dot{C1}\), we might incidentally make \(\dot{d2} >= 0\). Remember that equation(5), is a formula for \(\dot{C}: \dot{d} = 0\) not \(\dot{C}: \dot{d} >= 0\). So we don't need to apply it to \(\dot{C2}\) anymore. We can detect this by looking at the sign of \(\lambda\). If the sign of \(\lambda\) is negative, that means the constraint is already satisfied. If we use this negative lambda as an impulse, it means we pull it closer instead of pushing it apart. It is fine for individual \(\lambda\) to be negative. But, we need to make sure the accumulation of \(\lambda\) is not negative. In each iteration, we add the current lambda to normalImpulseSum. Then we clamp the normalImpulseSum between 0 and positive infinity. The actual Lagrangian multiplier that we will use to calculate the impulse is the difference between the new normalImpulseSum and the previous normalImpulseSum Restitution Okay, now we have successfully resolve contact penetration in our physics engine. But what about simulating objects that bounce when a collision happens. The property to bounce when a collision happens is called restitution. The coefficient of restitution denoted \(C_{r}\), is the ratio of the parting speed after the collision and the closing speed before the collision. The coefficient of restitution only affects the velocity along the normal direction. So we need to do the dot operation with the normal vector. Notice that in this specific case the \(V_{initial}\) is similar to JV. If we look back at our constraint above, we set \(\dot{d}\) to zero because we assume that the object does not bounce back(\(C_{r}=0\)).So, if \(C_{r} != 0\), instead of 0, we can modify our constraint so the desired velocity is \(V_{final}\). We can merge our old bias term with the restitution term to get a new bias value. // init constraint // Calculate J(M^-1)(J^T). This term is constant so we can calculate this first for (int i = 0; i < constraint->numContactPoint; i++) { ftContactPointConstraint *pointConstraint = &constraint->pointConstraint; pointConstraint->r1 = manifold->contactPoints.r1 - (bodyA->transform.center + bodyA->centerOfMass); pointConstraint->r2 = manifold->contactPoints.r2 - (bodyB->transform.center + bodyB->centerOfMass); real kNormal = bodyA->inverseMass + bodyB->inverseMass; // Calculate r X normal real rnA = pointConstraint->r1.cross(constraint->normal); real rnB = pointConstraint->r2.cross(constraint->normal); // Calculate J(M^-1)(J^T). kNormal += (bodyA->inverseMoment * rnA * rnA + bodyB->inverseMoment * rnB * rnB); // Save inverse of J(M^-1)(J^T). pointConstraint->normalMass = 1 / kNormal; pointConstraint->positionBias = m_option.baumgarteCoef * manifold->penetrationDepth; ftVector2 vA = bodyA->velocity; ftVector2 vB = bodyB->velocity; real wA = bodyA->angularVelocity; real wB = bodyB->angularVelocity; ftVector2 dv = (vB + pointConstraint->r2.invCross(wB) - vA - pointConstraint->r1.invCross(wA)); //Calculate JV real jnV = dv.dot(constraint->normal pointConstraint->restitutionBias = -restitution * (jnV + m_option.restitutionSlop); } // solve constraint while (numIteration > 0) { for (int i = 0; i < m_constraintGroup.nConstraint; ++i) { ftContactConstraint *constraint = &(m_constraintGroup.constraints); int32 bodyIDA = constraint->bodyIDA; int32 bodyIDB = constraint->bodyIDB; ftVector2 normal = constraint->normal; ftVector2 tangent = normal.tangent(); for (int j = 0; j < constraint->numContactPoint; ++j) { ftContactPointConstraint *pointConstraint = &(constraint->pointConstraint[j]); ftVector2 vA = m_constraintGroup.velocities[bodyIDA]; ftVector2 vB = m_constraintGroup.velocities[bodyIDB]; real wA = m_constraintGroup.angularVelocities[bodyIDA]; real wB = m_constraintGroup.angularVelocities[bodyIDB]; //Calculate JV. (jnV = JV, dv = derivative of d, JV = derivative(d) dot normal)) ftVector2 dv = (vB + pointConstraint->r2.invCross(wB) - vA - pointConstraint->r1.invCross(wA)); real jnV = dv.dot(normal); //Calculate Lambda ( lambda real nLambda = (-jnV + pointConstraint->positionBias / dt + pointConstraint->restitutionBias) * pointConstraint->normalMass; // Add lambda to normalImpulse and clamp real oldAccumI = pointConstraint->nIAcc; pointConstraint->nIAcc += nLambda; if (pointConstraint->nIAcc < 0) { pointConstraint->nIAcc = 0; } // Find real lambda real I = pointConstraint->nIAcc - oldAccumI; // Calculate linear impulse ftVector2 nLinearI = normal * I; // Calculate angular impulse real rnA = pointConstraint->r1.cross(normal); real rnB = pointConstraint->r2.cross(normal); real nAngularIA = rnA * I; real nAngularIB = rnB * I; // Apply linear impulse m_constraintGroup.velocities[bodyIDA] -= constraint->invMassA * nLinearI; m_constraintGroup.velocities[bodyIDB] += constraint->invMassB * nLinearI; // Apply angular impulse m_constraintGroup.angularVelocities[bodyIDA] -= constraint->invMomentA * nAngularIA; m_constraintGroup.angularVelocities[bodyIDB] += constraint->invMomentB * nAngularIB; } } --numIteration; } General Step to Solve Constraint In this article, we have learned how to solve contact penetration by defining it as a constraint and solve it. But this framework is not only used to solve contact penetration. We can do many more cool things with constraints like for example implementing hinge joint, pulley, spring, etc. So this is the step-by-step of constraint resolution: Define the constraint in the form \(\dot{C}: JV + b = 0\). V is always \(\begin{bmatrix} \vec{v1} \\ w1 \\ \vec{v2} \\ w2\end{bmatrix}\) for every constraint. So we need to find J or the Jacobian Matrix for that specific constraint. Decide the number of iteration for the sequential impulse. Next find the Lagrangian multiplier by inserting velocity, mass, and the Jacobian Matrix into this equation: Do step 3 for each constraint, and repeat the process as much as the number of iteration. Clamp the Lagrangian multiplier if needed. This marks the end of this article. Feel free to ask if something is still unclear. And please inform me if there are inaccuracies in my article. Thank you for reading. NB: Box2d use sequential impulse, but does not use baumgarte stabilization anymore. It uses full NGS to resolve the position drift. Chipmunk still use baumgarte stabilization. References Allen Chou's post on Constraint Resolution A Unified Framework for Rigid Body Dynamics An Introduction to Physically Based Modeling: Constrained Dynamics Erin Catto's Box2d and presentation on constraint resolution Falton Debug Visualizer 18_01_2018 22_40_12.mp4 equation.svg
  6. I call on the shatter function and it now has a series of chunks stored, and I can retrieve those to the main physics system. But do I hide the main object and re-construct the fragment pieces into some other brand new game objects or some sort? Thanks Jack
  7. Hello, I'm trying to use needBroadphaseCollision to filter collision between moveable objects and player. It works pretty well but there is one problem. The idea is simple: If an object is still or does not move faster that a threshold, ignore collision with players physical body. In this case I use my own code to update player. If the speed of this object breaks that threshold, convert player to rag-doll and let Bullet do the update. I'm using my own custom character controller as i couldn't use Bullets. My player is a ragdoll with btRigidBody bodyparts where linear and angular factors are set to 0 and these limbs are updated based on model animation as long as the player has control over their character. As soon as collision with a fast moving object happens, player loses control over their character, linear an angular factors are set to 1 and i let Bullet handle the ragdoll physics. It works well for most objects but i have an object that uses btCompoundShape for its body. When this object is still, (it didn't move for a while) it works. However when this object starts to move and doesn't break the speed threshold, it gets affected by players physical body (player starts to push this object around). I added some debug variables and it seems that even when needBroadphaseCollision returns false, there are still contact points generated between player and this object. What am i missing?
  8. I am a beginner in the Game Dev business, however I plan to build a futuristic MMO with some interesting mechanics. However, I have some doubts about shooting mechanics that I chose for this game and would like to know your opinion on this. The mechanic goes as follows: - Each gun would have it's damage-per-shot value - Each gun would have it's shots-per-second value - Each gun would have it's accuracy rating Now the question is: how to calculate the output damage? I have three available options: 1) Calculate the chance of each shot hitting the target (per-shot accuracy) 2) Multiply the damage output of a weapon by it's accuracy rating (weapon with 50% accuracy deals 50% of it's base damage) 3) Don't use accuracy at all and just adjust the weapon damage output Which of these three mechanics would you like to see in a game? Mind, this will be an MMO game, so it will have lock-on targets, AoE effects and all that jazz.
  9. My AI subsystem is completed dragged by the physics with objects with Gimpact proxies.. When you need to calculate stuff like bumps, it is very horrible...It is even worse than using compound vehicle methods... Thanks Jack
  10. I looked one of the the bullet physics samples which talks about the topic in height field. But however, when the height fields get rendered, the "DemoApplication" class calls the opengl shape drawer object which finally retrieves the display list of the collision shape, which is strongly coupled to opengl, I want to do the same thing with DirectX (D3DX at the moment, damn old, but hey).. How can I draw the height fields out? Is there a way to turn the display list into something recognizable by Direct3D 9? Thanks Jack
  11. //synchronize the wheels with the (interpolated) chassis worldtransform l_vehicle->updateWheelTransform(j,true); const btTransform& t = l_vehicle->getWheelInfo(j).m_worldTransform; D3DXMATRIX l_mat = BT2DX_MATRIX(t); D3DXMATRIX l_rot; D3DXMatrixRotationY(&l_rot, 1.57f); l_mat = l_rot * l_mat; // assume front wheels AgentMotionState* motion = dynamic_cast(l_vehicle->getRigidBody()->getMotionState()); if (motion) { boost::shared_ptr pObj = motion->m_object; if (j==0) { D3DXVECTOR3 s, p; D3DXQUATERNION r; D3DXMatrixDecompose(&s, &r, &p, &l_mat); double yaw, pitch, roll; yaw = pitch = roll = 0.0f; QuatToEuler(r, yaw, pitch, roll); TRACE("Veh: " << i << "Pos of wheel 0 is " << p.x << " " << p.y << " " << p.z); yaw = CapRadian(yaw); TRACE("Veh: " << i << "Rot of wheel 0 is " << yaw); FRAME* frontWheels = (FRAME*)D3DXFrameFind(pObj->m_mesh->GetFrameRoot(), "Front_Left_Wheel"); frontWheels->matCombined = l_mat; //frontWheels->TransformationMatrix = l_mat; } Looks like the left front wheel is on the far left of the chassis with a large gap? Why is that? Thanks Jack
  12. I used to use ScreenPointToRay function to help me do this in Unity3d. But now I use Ogre and Bullet, I have to do this on my own. I try to dig into Bullet's example and find out this function getRayTo which convert the point on that click on screen (camera) to the 3d world point with 'farPlane' distance from the camera (that what I think). Then they create the ray (vector AB) by set the A point is the camera position, B point is the point get from the function getRayTo above. I try to re-implement this function in my project (use Ogre for graphic, so I have to use Ogre's camera and world). But I can't get it right because I don't understand the function getRayTo from Bullet. Please explain the algorithm to convert screen point to ray. If there is a better algorithm please teach me. Note: the scenario to use this algorithm is to find out the position to go for the character - like in the game TouchLight - a point and click game. https://github.com/bulletphysics/bullet3/blob/d52fb7510bbe3801431cc0a431e4c1847ee3e0f1/examples/CommonInterfaces/CommonRigidBodyBase.h#L17
  13. The forklift just slides across the floor. You may ask, hey, the wheels are frictionless, if I apply a friction of 1000.0f, the forklift just bounces to the air? If I apply 1.0, the forklift still slips around... Also, I have to apply a very large engine force in order to move the forklift, such as 100000.0 kg The chassis is 200kg, upper mask is 70kg, lower mask is 60kg, front wheels are 50kg and rear wheels are 50kg I just stuff them up. float maxEngineForce = 1000.f;//this should be engine/velocity dependent float maxBreakingForce = 100.f; float gVehicleSteering = 0.f; float steeringIncrement = 0.04f; float steeringClamp = 0.3f; //float wheelFriction = 10.0f; //1000;//BT_LARGE_FLOAT; float wheelFriction = 0.0f; float suspensionStiffness = 20.f; float suspensionDamping = 2.3f; float suspensionCompression = 4.4f; float rollInfluence = 0.1f;//1.0f; any ideas?
  14. I just keep stacking onto the compound shape, where the chassis is a box and the wheels are cylinders.... When getting rendered, they just fall apart, especially the chassis slips over and fall onto the ground...I haven't added constraints yet and I am just rendering the compound, not the vehicle type... I have a hard time understanding the forklift example though... And if I forget about the individual shapes and add as a compound shape in the end, I don't know how to apply constraints to the vehicle because they have no rigid bodies to create at all. You have to add the final compound shape and create a rigid body from there, if needing to add constraints, you need to have some references to the rigid bodies created from individual parts of the vehicle. thanks Jack
  15. When a body experiences a collision, there may be causing a bump or decal on the body itself, and the box shape or hull shape only affects the transformation, how do I make it affect the vertex buffer, because in soft bodies simulation, you could actually affect the vertex buffer, you can't with rigid bodies, if I cast a soft body on the rigid body with limited elasticity. ohhh. but real strange to me... how do I make this happen? Thanks Jack
  16. If I set the physics after AI, physics will dominate the final world transformations, which totally erased the world transformations calculated from the AI, or vice versa. I want to calculate the relative transformation when physics is in effect, how do I do that with btMotionState or derived classes with getWorldTransform overrided? Thanks Jack
  17. JeimyRM

    C Game - The Good Fight

    Hi, i have created and programmed a Windows console game and also i uploaded a video of the gameplay on YouTube here's the link: If you read the video description on YouTube you can find the source code link to download. So don't miss it!. Attached to this topic you can find the game executable(and the rest of the files) in a RAR file for you to play!...Download it now! Thanks for your time!... The Good Fight.rar
  18. Hi there,I'm the developer of "Silver Horizon",RNGSilvercraft. ======================== "Silver Horizon"is a 2d shoot'em up game. Aside from the standard shoot'em up gimmicks,this game allows you to level up your ship for later stages. The game is inspired by the Gradius series and Touhou series. This game was made by using MMF2.5,with soundtrack made by using FL studio. The game featuring: *A level up system(customize your ship by getting exp points) *Two different play style *6 original stages with unique musics The control and instruction of the game can be found in the "readme"file. Download link:https://rngsilvercraft.itch.io/silver-horizon ===================================== This is the first time I develop a full-sized game,since I have only made minigames before. The whole game,including programming,art,graphic,story,planning,even the soundtrack,is all made only by myself. I have to admit that I'm not really good at drawing,and since I'm from Taiwan(I'm only 18 BTW),there might be some grammar mistakes or misspelling here and there in the game XD. After approximately 80 hours of works(I supposed),this 6-stages-long game was finally finished.There might have some minor bugs I didn't find when testing. If you find any glitches,please let me know. My email address:yi88613@gmail.com BTW,I hid a pretty overpowered easter egg in the game.See if you can find it Please support my game! The trailer: My soundcloud: https://soundcloud.com/pk0m5zydjazg My youtube channel: https://www.youtube.com/channel/UCiQ4F7WZ5-soYvvgrXEyd1Q Screenshots:
  19. I want to simulate a object on a rope. Here is what I've tried: btScalar SpringLength( 3 ); btScalar PivotOffset( 0 ); btScalar SpringRange( 7 ); PlaneShape = new btBoxShape( btVector3( 1, 1, 1 ) ); btTransform tr; tr.setIdentity( ); tr.setOrigin( btVector3( 0, 0, 0 ) ); tr.getBasis( ).setEulerYPR( 0, 0, 0 ); MotionState = new btDefaultMotionState( ); MotionState->setWorldTransform( tr ); btRigidBody* pBodyA = new btRigidBody( 1, MotionState, PlaneShape ); m_pWorld->addRigidBody( pBodyA ); btTransform frameInA; frameInA = btTransform::getIdentity( ); frameInA.setOrigin( btVector3( 0, 0, 0 ) ); tr.setIdentity( ); tr.setOrigin( btVector3( 0, 60 - SpringLength - PivotOffset, 0 ) ); tr.getBasis( ).setEulerYPR( 0, 0, 0 ); MotionState = new btDefaultMotionState( ); MotionState->setWorldTransform( tr ); BoxShape = new btBoxShape( btVector3( 1, 1, 1 ) ); btRigidBody* pBodyB = new btRigidBody( 0, MotionState, BoxShape ); m_pWorld->addRigidBody( pBodyB ); btTransform frameInB; frameInB = btTransform::getIdentity( ); frameInB.setOrigin( btVector3( PivotOffset, -10, 0 ) ); btGeneric6DofSpringConstraint * pGen6DOFSpring = new btGeneric6DofSpringConstraint( *pBodyA, *pBodyB, frameInA, frameInB, true ); pGen6DOFSpring->setLinearLowerLimit( btVector3( - SpringRange, - 0, - SpringRange ) ); pGen6DOFSpring->setLinearUpperLimit( btVector3( + SpringRange, + 0, + SpringRange ) ); pGen6DOFSpring->setAngularLowerLimit( btVector3( - SpringRange, - SpringRange, - SpringRange ) ); pGen6DOFSpring->setAngularUpperLimit( btVector3( + SpringRange, + SpringRange, + SpringRange ) ); m_pWorld->addConstraint( pGen6DOFSpring, true ); for ( int i = 0; i < 3; ++i ) { pGen6DOFSpring->enableSpring( i, true ); pGen6DOFSpring->setStiffness( i, 1 ); pGen6DOFSpring->setStiffness( i + 3, 1 ); pGen6DOFSpring->setDamping( i, btScalar( 0.99 ) ); pGen6DOFSpring->setDamping( i + 3, btScalar( 0.99 ) ); pGen6DOFSpring->setParam( BT_CONSTRAINT_STOP_CFM, btScalar( (1.0E-5) ), i ); pGen6DOFSpring->setParam( BT_CONSTRAINT_STOP_CFM, btScalar( ( 1.0E-5 ) ), i + 3 ); pGen6DOFSpring->setParam( BT_CONSTRAINT_CFM, btScalar( ( 1.0E-5 ) ), i ); pGen6DOFSpring->setParam( BT_CONSTRAINT_CFM, btScalar( ( 1.0E-5 ) ), i+3 ); } pGen6DOFSpring->setEquilibriumPoint( ); The object moves like it's on a rope, but it doesn't rotate at all. I am an absolute beginner with bullet physics
  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!