Custom joints vehicle and weak joints

A place to discuss everything related to Newton Dynamics.

Moderators: Sascha Willems, walaber

Re: Custom joints vehicle and weak joints

Postby kallaspriit » Sun Jan 03, 2010 4:23 pm

Updated SVN, good work :P
kallaspriit
 
Posts: 216
Joined: Sun Aug 14, 2005 6:31 pm

Re: Custom joints vehicle and weak joints

Postby Julio Jerez » Mon Jan 04, 2010 10:51 am

Ok I did not make progress yesterday in Ogre Newt because I spend time revamping my old collada until to convert my mesh to collada format.
This is to follow on the proposal i made on this thread http://newtondynamics.com/forum/viewtopic.php?f=9&t=5620

I already have the converter successfully exporting all of thet data, for example I converted the F1 and here is the model
http://www.newtondynamics.com/downloads/f1.rar
this model now have all of the piece as parts as an articulate body, not like the demo that only have the body and the tire because it put together by hand, therefore the suspension part do no animate.

If you have time could and you or Pjani use any kind of Collada Viewer, could to please try and see if it work, Collada file format is all wacky and no all loaders supports all of the possibilities to encode a mesh.
This is a plain vanilla for now so it must be compatible with almost all viewers.

anyway after I finish few more details, I will go back to OgreNewt and add the two flavors: Expert scene and Import Scene.

Basically import Scene will ready a Collada file and create return and Ogre Node, that will contain all children nodes, all Entities, all Meshes all Materials and all animations.
With this we can handle both Node Animations and Skeletal Animations.

I will take me perhaps another day to write the Scene Importer, but I believe this will be worth the effort since it will facilitate the usage of OgreNewt for almost anyone with a Modeling Package with a Collada exporter,
and if it can export Physics even better.

What do you think of adding Collada to OgreNewt as the Asset Manager for content?


The bad news is that My brak form work is over and now I cna onlyu work litle bit at night and weekeds, by we will get there do not worry.
Julio Jerez
Moderator
Moderator
 
Posts: 12425
Joined: Sun Sep 14, 2003 2:18 pm
Location: Los Angeles

Re: Custom joints vehicle and weak joints

Postby PJani » Mon Jan 04, 2010 12:57 pm

Julio Jerez wrote:If you have time could and you or Pjani use any kind of Collada Viewer, could to please try and see if it work, Collada file format is all wacky and no all loaders supports all of the possibilities to encode a mesh.
This is a plain vanilla for now so it must be compatible with almost all viewers.


Hmm im kind of out of time the exam period starts in two weeks and i need to increase my average :shock:

As i know ogre3d has collada loader plugin somewere in addon SVN, but i have never chance to test it. i am trying to avoid any external system for scene loading, some times is very hard to add your own things, but i think the collada importer will make newton and ogre more popular... :wink:
Im writing my own system for this, im taking battlefield 2 for example (geometry, physics, sound, AI, etc. are templated as a python script i load them using embedded python interpreter. I could show you AI and Newton together using python, but multibody car is not jet(please correct me if i am wrong!!!) supported in Newton 2 it was in Newton 1.35).
Last edited by PJani on Mon Jan 04, 2010 2:44 pm, edited 1 time in total.
| i7-5930k@4.2Ghz, EVGA 980Ti FTW, 32GB RAM@3000 |
| Dell XPS 13 9370, i7-8550U, 16GB RAM |
| Ogre 1.7.4 | VC++ 9 | custom OgreNewt, Newton 300 |
| C/C++, C# |
User avatar
PJani
 
Posts: 448
Joined: Mon Feb 02, 2009 7:18 pm
Location: Slovenia

Re: Custom joints vehicle and weak joints

Postby Julio Jerez » Mon Jan 04, 2010 2:32 pm

The Collada loader in Ogre does not seem to be prime time, plsu eit doe no have custon extra we can add for OgreNewt integration.
The beauty of collada is tha we can add extar infomation for Game play, an dteh info is preserved. It is Ok I think I have an idea of what I need to do.
I just need a day or two to get it ready.

About the mutiobody car , Netwon 2 has a mutibody car joint, I have no added yet because I wnat for finish all Ogre Newton Funtionality before we move wih new funtionality.
But yet there will be a Mutibody car wraped joint from Newton to Ogre newton.
Julio Jerez
Moderator
Moderator
 
Posts: 12425
Joined: Sun Sep 14, 2003 2:18 pm
Location: Los Angeles

Re: Custom joints vehicle and weak joints

Postby PJani » Mon Jan 04, 2010 4:53 pm

Julio Jerez wrote:About the mutiobody car , Netwon 2 has a mutibody car joint, I have no added yet because I wnat for finish all Ogre Newton Funtionality before we move wih new funtionality.
But yet there will be a Mutibody car wraped joint from Newton to Ogre newton.


Cant wait to see it in action, because i saw differential in there. But i have question...what about differential between differentials just asking because all 4x4 and 8x8, etc. have differentials between them. :D
| i7-5930k@4.2Ghz, EVGA 980Ti FTW, 32GB RAM@3000 |
| Dell XPS 13 9370, i7-8550U, 16GB RAM |
| Ogre 1.7.4 | VC++ 9 | custom OgreNewt, Newton 300 |
| C/C++, C# |
User avatar
PJani
 
Posts: 448
Joined: Mon Feb 02, 2009 7:18 pm
Location: Slovenia

Re: Custom joints vehicle and weak joints

Postby Julio Jerez » Mon Jan 04, 2010 5:11 pm

let us not get too far ahead, we will get there, i can asure you that, but for now we need to focus in getting the basic funtionality of OgreNewt up today.
Julio Jerez
Moderator
Moderator
 
Posts: 12425
Joined: Sun Sep 14, 2003 2:18 pm
Location: Los Angeles

Re: Custom joints vehicle and weak joints

Postby PJani » Mon Jan 04, 2010 5:35 pm

Hehe, just asking :)
| i7-5930k@4.2Ghz, EVGA 980Ti FTW, 32GB RAM@3000 |
| Dell XPS 13 9370, i7-8550U, 16GB RAM |
| Ogre 1.7.4 | VC++ 9 | custom OgreNewt, Newton 300 |
| C/C++, C# |
User avatar
PJani
 
Posts: 448
Joined: Mon Feb 02, 2009 7:18 pm
Location: Slovenia

Re: Custom joints vehicle and weak joints

Postby kallaspriit » Sun Jan 17, 2010 9:25 am

I realize we have broken the existing custom joint interface so any custom joints, that users have created, do not work anymore.

In your custom joint example, you do:
Code: Select all
class MyCustomBallSocket : public OgreNewt::BallAndSocket

but a real custom joint should extend OgreNewt::CustomJoint, not an existing custom joint like BallAndSocket.

How can we make the existing custom joints work or at-least require minimum modification?

For example, in my project, I have:

LockedDifferential.h
Code: Select all
#ifndef LOCKEDDIFFERENTIAL_H_INCLUDED
#define LOCKEDDIFFERENTIAL_H_INCLUDED

#include <OgreNewt.h>
#include "OgreNewtExtensions.h"

namespace VD
{
    namespace Vehicle
    {
        class LockedDifferential : public OgreNewt::Joint
        {
            public:
                LockedDifferential(OgreNewt::BodyPtr child, OgreNewt::BodyPtr parent, Ogre::Vector3 pin);
                ~LockedDifferential();
                void submitConstraint(Ogre::Real timeStep, int threadIndex);

            private:
                Ogre::Vector3 localChildPosition;
                Ogre::Vector3 localParentPosition;

                Ogre::Quaternion localChildOrientation;
                Ogre::Quaternion localParentOrientation;

                Ogre::Vector3 pin;

        };
    } // namespace Vehicle
} // namespace VD

#endif // LOCKEDDIFFERENTIAL_H_INCLUDED


LockedDifferential.cpp
Code: Select all
#include "Vehicle/LockedDifferential.h"

#include "Debug/VectorDebugger.h"

#define MIN_JOINT_PIN_LENGTH -1.5f

#include "MemoryLeakDetection.h"

namespace VD
{
    namespace Vehicle
    {
        LockedDifferential::LockedDifferential(OgreNewt::BodyPtr child, OgreNewt::BodyPtr parent, Ogre::Vector3 pin) : OgreNewt::CustomJoint(1, child.get(), parent.get())
        {
            this->pin = pin;

            Ogre::Vector3 parentPosition, childPosition;
            Ogre::Quaternion parentOrientation, childOrientation;

            m_body0->getPositionOrientation(childPosition, childOrientation);
            m_body1->getPositionOrientation(parentPosition, parentOrientation);

            pinAndDirToLocal(childPosition, pin, localChildOrientation, localChildPosition, localParentOrientation, localParentPosition);
        }

        LockedDifferential::~LockedDifferential()
        {
        }

        void LockedDifferential::submitConstraint(Ogre::Real timeStep, int threadIndex)
        {
            Ogre::Quaternion globalChildOrientation, globalParentOrientation;
            Ogre::Vector3 globalChildPosition, globalParentPosition;

            localToGlobal(localChildOrientation, localChildPosition, globalChildOrientation, globalChildPosition, 0);
            localToGlobal(localParentOrientation, localParentPosition, globalParentOrientation, globalParentPosition, 1);

            Ogre::Vector3 childOmega = m_body0->getOmega();
            Ogre::Vector3 parentOmega = m_body1->getOmega();

            float childAngularVelocity = childOmega.dotProduct(globalChildOrientation * Ogre::Vector3::UNIT_X);
            float parentAngularVelocity = parentOmega.dotProduct(globalParentOrientation * -Ogre::Vector3::UNIT_X);

            float relativeOmega = childAngularVelocity + (1.0f * parentAngularVelocity);
            float relativeAcceleration = -0.3f * relativeOmega / timeStep;

            addGeneralRow(Ogre::Vector3::ZERO, globalChildOrientation * Ogre::Vector3::UNIT_X, Ogre::Vector3::ZERO, globalParentOrientation * -Ogre::Vector3::UNIT_X);

            setRowAcceleration(relativeAcceleration);

        }
    } // namespace Vehicle
} // namespace VD


How would I go about getting the same result with the new interface? I could probably extend the hinge joint, but this should not be necessary. Can we restore the OgreNewt::CustomJoint interface with the new underlying system?
kallaspriit
 
Posts: 216
Joined: Sun Aug 14, 2005 6:31 pm

Re: Custom joints vehicle and weak joints

Postby kallaspriit » Sun Jan 17, 2010 11:46 am

I can reply myself, to get existing custom joints to work, I had to make the following changes:

I added the following to OgreNewt_Joint.h
Code: Select all
class _OgreNewtExport CustomJoint : public Joint
   {
   public:
      CustomJoint( unsigned int maxDOF, const OgreNewt::Body* child, const OgreNewt::Body* parent);
      virtual ~CustomJoint();

      void pinAndDirToLocal( const Ogre::Vector3& pinpt, const Ogre::Vector3& pindir, Ogre::Quaternion& localOrient0, Ogre::Vector3& localPos0, Ogre::Quaternion& localOrient1, Ogre::Vector3& localPos1 ) const;
      void localToGlobal( const Ogre::Quaternion& localOrient, const Ogre::Vector3& localPos, Ogre::Quaternion& globalOrient, Ogre::Vector3& globalPos, int bodyIndex ) const;
      void globalToLocal( const Ogre::Quaternion& globalOrient, const Ogre::Vector3& globalPos, Ogre::Quaternion& localOrient, Ogre::Vector3& localPos, int bodyIndex ) const;
      Ogre::Quaternion grammSchmidt( const Ogre::Vector3& pin ) const;

   protected:
      unsigned int m_maxDOF;

      const OgreNewt::Body* m_body0;
      const OgreNewt::Body* m_body1;
   };


Following to OgreNewt_Joint.cpp:
Code: Select all
CustomJoint::CustomJoint( unsigned int maxDOF, const Body* child, const Body* parent ) : Joint()
{
   NewtonCustomJoint* suppportJoint;

   suppportJoint = new CustomUserJoint(maxDOF, child->getNewtonBody(), parent ? parent->getNewtonBody() : NULL);
   SetSupportJoint(suppportJoint);

   m_maxDOF = maxDOF;

    m_body0 = child;
    m_body1 = parent;
}

CustomJoint::~CustomJoint()
{
}

void CustomJoint::pinAndDirToLocal( const Ogre::Vector3& pinpt, const Ogre::Vector3& pindir,
                                   Ogre::Quaternion& localOrient0, Ogre::Vector3& localPos0, Ogre::Quaternion& localOrient1, Ogre::Vector3& localPos1 ) const
{
    localOrient0 = localOrient1 =  Ogre::Quaternion::IDENTITY;
    localPos0 = localPos1 = Ogre::Vector3::ZERO;

    Ogre::Quaternion bodyOrient0 = Ogre::Quaternion::IDENTITY;
    Ogre::Quaternion bodyOrient1 = Ogre::Quaternion::IDENTITY;
    Ogre::Vector3 bodyPos0 = Ogre::Vector3::ZERO;
    Ogre::Vector3 bodyPos1 = Ogre::Vector3::ZERO;

    Ogre::Quaternion pinOrient = grammSchmidt(pindir);

    getBody0()->getPositionOrientation( bodyPos0, bodyOrient0 );

    if (getBody1() != NULL)
   {
        getBody1()->getPositionOrientation( bodyPos1, bodyOrient1 );
   }

    localPos0 = bodyOrient0.Inverse() * (pinpt - bodyPos0);
    localOrient0 = pinOrient * bodyOrient0.Inverse();

    localPos1 = bodyOrient1.Inverse() * (pinpt - bodyPos1);
    localOrient1 = pinOrient * bodyOrient1.Inverse();

}

void CustomJoint::localToGlobal( const Ogre::Quaternion& localOrient, const Ogre::Vector3& localPos, Ogre::Quaternion& globalOrient, Ogre::Vector3& globalPos, int bodyIndex ) const
{
    globalOrient = Ogre::Quaternion::IDENTITY;
    globalPos= Ogre::Vector3::ZERO;

    const Body* bdy = NULL;
    if (bodyIndex == 0)
        bdy = getBody0();
    else if (getBody1())
        bdy = getBody1();

    Ogre::Quaternion bodyOrient = Ogre::Quaternion::IDENTITY;
    Ogre::Vector3 bodyPos = Ogre::Vector3::ZERO;

    if (bdy)
   {
        bdy->getPositionOrientation( bodyPos, bodyOrient );
   }

    globalPos = (bodyOrient * localPos) + bodyPos;
    globalOrient = bodyOrient * localOrient;
}

void CustomJoint::globalToLocal( const Ogre::Quaternion& globalOrient, const Ogre::Vector3& globalPos, Ogre::Quaternion& localOrient, Ogre::Vector3& localPos, int bodyIndex ) const
{
    localOrient = Ogre::Quaternion::IDENTITY;
    localPos= Ogre::Vector3::ZERO;

    const Body* bdy = NULL;
    if (bodyIndex == 0)
        bdy = getBody0();
    else if (getBody1() != NULL)
        bdy = getBody1();

    Ogre::Quaternion bodyOrient = Ogre::Quaternion::IDENTITY;
    Ogre::Vector3 bodyPos = Ogre::Vector3::ZERO;

    if (bdy)
        bdy->getPositionOrientation( bodyPos, bodyOrient );

    Ogre::Quaternion bodyOrientInv = bodyOrient.Inverse();

    localOrient = bodyOrientInv * globalOrient;
    localPos = bodyOrientInv * (globalPos - bodyPos);
}

Ogre::Quaternion CustomJoint::grammSchmidt( const Ogre::Vector3& pin ) const
{
    Ogre::Vector3 front, up, right;
    front = pin;

    front.normalise();
    if (Ogre::Math::Abs( front.z ) > 0.577f)
        right = front.crossProduct( Ogre::Vector3(-front.y, front.z, 0.0f) );
    else
        right = front.crossProduct( Ogre::Vector3(-front.y, front.x, 0.0f) );
    right.normalise();
    up = right.crossProduct( front );

    Ogre::Matrix3 ret;
    ret.FromAxes( front, up, right );

    Ogre::Quaternion quat;
    quat.FromRotationMatrix( ret );

    return quat;
}


Since NewtonCustomJoint class is abstract, I had to add the following class to JointLibrary:
CustomUserJoint.h
Code: Select all
/* Copyright (c) <2009> <Newton Game Dynamics>
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely
*/


// CustomUserJoint.h: interface for the CustomUserJoint class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_CUSTOMUSERJOINT_H__B631F556_468B_4331_B7D7_F85ECF3E9ADE__INCLUDED_)
#define AFX_CUSTOMUSERJOINT_H__B631F556_468B_4331_B7D7_F85ECF3E9ADE__INCLUDED_

#include "NewtonCustomJoint.h"
class JOINTLIBRARY_API CustomUserJoint: public NewtonCustomJoint 
{
   public:
   CustomUserJoint(unsigned int maxDOF, const NewtonBody* child, const NewtonBody* parent = NULL);
   virtual ~CustomUserJoint();

   protected:
   virtual void SubmitConstraints (dFloat timestep, int threadIndex);
   virtual void GetInfo (NewtonJointRecord* info) const;
};

#endif // !defined(AFX_CUSTOMUSERJOINT_H__B631F556_468B_4331_B7D7_F85ECF3E9ADE__INCLUDED_)



And CustomUserJoint.cpp:
Code: Select all
/* Copyright (c) <2009> <Newton Game Dynamics>
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely
*/


// CustomUserJoint.cpp: implementation of the CustomUserJoint class.
//
//////////////////////////////////////////////////////////////////////
#include "CustomJointLibraryStdAfx.h"
#include "CustomUserJoint.h"


//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

#define MIN_JOINT_PIN_LENGTH   50.0f


CustomUserJoint::CustomUserJoint(unsigned int maxDOF, const NewtonBody* child, const NewtonBody* parent)
   :NewtonCustomJoint(maxDOF, child, parent)
{
}

CustomUserJoint::~CustomUserJoint()
{
}

void CustomUserJoint::GetInfo (NewtonJointRecord* info) const
{
   strcpy (info->m_descriptionType, "customuser");

   info->m_attachBody_0 = m_body0;
   info->m_attachBody_1 = m_body1;

   info->m_minLinearDof[0] = 0.0f;
   info->m_maxLinearDof[0] = 0.0f;

   info->m_minLinearDof[1] = 0.0f;
   info->m_maxLinearDof[1] = 0.0f;;

   info->m_minLinearDof[2] = 0.0f;
   info->m_maxLinearDof[2] = 0.0f;

   info->m_minAngularDof[0] = -FLT_MAX ;
   info->m_maxAngularDof[0] =  FLT_MAX ;
   info->m_minAngularDof[1] = -FLT_MAX ;
   info->m_maxAngularDof[1] =  FLT_MAX ;
   info->m_minAngularDof[2] = -FLT_MAX ;
   info->m_maxAngularDof[2] =  FLT_MAX ;
}


void CustomUserJoint::SubmitConstraints (dFloat timestep, int threadIndex)
{
}


Julio, could you add the CustomUserJoint to jointlibrary or do I have to create it in OgreNewt?
kallaspriit
 
Posts: 216
Joined: Sun Aug 14, 2005 6:31 pm

Re: Custom joints vehicle and weak joints

Postby Julio Jerez » Sun Jan 17, 2010 2:53 pm

kallaspriit wrote:I realize we have broken the existing custom joint interface so any custom joints, that users have created, do not work anymore.

all joint are derive form teh custom joint, so it sould trivial to make any joint any one mande uing teh new inteface.
In fac it should be way aof a lot simpler to make it now that was before, since there is only common joint interface.
Julio Jerez
Moderator
Moderator
 
Posts: 12425
Joined: Sun Sep 14, 2003 2:18 pm
Location: Los Angeles

Re: Custom joints vehicle and weak joints

Postby kallaspriit » Sun Jan 17, 2010 4:19 pm

What about the joints people have already made and when they try to move to a new version of OgreNewt. Also, if you want to create a really custom joint using the JointLibrary and the new interface you have created, then what should you use for the support joint? Currently there is no general joint to use and NewtonCustomJoint is abstract - thats why I created CustomUserJoint class in JointLibrary and restored OgreNewt::CustomJoint interface that uses it - this way no existing code is broken and people can create new custom joints that are not based on any of the existing ones, I think this is important to have.

Can you add the CustomUserJoint to JointLibrary / propose a better way of handling this or do I have to add that class directly to OgreNewt?
kallaspriit
 
Posts: 216
Joined: Sun Aug 14, 2005 6:31 pm

Re: Custom joints vehicle and weak joints

Postby Julio Jerez » Sun Jan 17, 2010 4:57 pm

No that is a mistake there should not be a profiferation of base classe all doin teh sam ethomg.
I will make a example of how to make a custom joint using Ogre::Joint.
then anyone who made a prorpetary joint cna use that as contorm joint.

I believe is the demos a made motor ou fo a hinge but calling the low level funtions,
making a custon joint will be very similar basically you make a black support joint and then in the callback you issue all the angular and linear contrainst.
this should be trivial to make, but if you problem figuring out I will add the demo.

you have teh correct idea when you liste the defintion

Code: Select all
class _OgreNewtExport CustomJoint : public Joint
   {
   public:
      CustomJoint( unsigned int maxDOF, const OgreNewt::Body* child, const OgreNewt::Body* parent);
      virtual ~CustomJoint();

      void pinAndDirToLocal( const Ogre::Vector3& pinpt, const Ogre::Vector3& pindir, Ogre::Quaternion& localOrient0, Ogre::Vector3& localPos0, Ogre::Quaternion& localOrient1, Ogre::Vector3& localPos1 ) const;
      void localToGlobal( const Ogre::Quaternion& localOrient, const Ogre::Vector3& localPos, Ogre::Quaternion& globalOrient, Ogre::Vector3& globalPos, int bodyIndex ) const;
      void globalToLocal( const Ogre::Quaternion& globalOrient, const Ogre::Vector3& globalPos, Ogre::Quaternion& localOrient, Ogre::Vector3& localPos, int bodyIndex ) const;
      Ogre::Quaternion grammSchmidt( const Ogre::Vector3& pin ) const;

   protected:
      unsigned int m_maxDOF;

      const OgreNewt::Body* m_body0;
      const OgreNewt::Body* m_body1;
   };


all you need to do is that you nee to make the Blank joint to serve as the support joint, which can be made anywhere, could be in the NetwonSDK side or on the OgreNewt Side.
In fact if you check the C inteface in the Netwon SDK I made thin joints all teh time to support some funtionality form some user.

do you have soem exmple joint some one made, to be use as and example in the Custom joint demo.
the one a put in the wraper is un-interesting.
Julio Jerez
Moderator
Moderator
 
Posts: 12425
Joined: Sun Sep 14, 2003 2:18 pm
Location: Los Angeles

Re: Custom joints vehicle and weak joints

Postby kallaspriit » Sun Jan 17, 2010 5:37 pm

The CustomUserJoint I made for the JointLibrary server exactly the function of a black/blank joint you were talking about and I revived the OgreNewt::CustomJoint interface for backwards compatibility - the same could probably be implemented directly in OgreNewt::Joint class.

The problem is where to get that black/blank joint - will you add one to JointLibrary (something like what I did and posted code, the CustonUserJoint) or do I have to add it directly to OgreNewt?

You can change the Demo07_CustomJoints demo and modify MyCustomMotorizedHinge class not to use OgreNewt::Hinge as base class. With my approach, it should be extending OgreNewt::CustomJoint or do you want to implement the custom joint base directly in OgreNewt::Joint?
kallaspriit
 
Posts: 216
Joined: Sun Aug 14, 2005 6:31 pm

Re: Custom joints vehicle and weak joints

Postby Julio Jerez » Sun Jan 17, 2010 7:03 pm

would not class NewtonCustomJoint serve as a blank joint, all Joints in the joint library are decendant from that base class
you can use that as you support joints, and then you can provid eteh function you need to make a generioc OgreCustom Joint, teh same way I make the other joints

does that sudn like a solution? Or am I still confused?
Julio Jerez
Moderator
Moderator
 
Posts: 12425
Joined: Sun Sep 14, 2003 2:18 pm
Location: Los Angeles

Re: Custom joints vehicle and weak joints

Postby kallaspriit » Mon Jan 18, 2010 1:49 pm

But isn't NewtonCustomJoint abstract? Then it should be modified a bit to serve as custom joint. Instead of modifying it, I created the subclass CustomUserJoint that just provides empty SubmitConstraints() but if you like modifying the base class, this would be fine too.
kallaspriit
 
Posts: 216
Joined: Sun Aug 14, 2005 6:31 pm

PreviousNext

Return to General Discussion

Who is online

Users browsing this forum: No registered users and 1 guest

cron