Part of the Khronos Group
OpenGL.org

The Industry's Foundation for High Performance Graphics

from games to virtual reality, mobile phones to supercomputers

Results 1 to 4 of 4

Thread: Ball doesn't rotate right after applying angular acceleration

  1. #1
    Newbie Newbie
    Join Date
    Apr 2015
    Posts
    2

    Ball doesn't rotate right after applying angular acceleration

    I have a Ball class which inherits The Body abstract class, this is the draw method of the ball class :

    Code :
    void Ball::draw() const
    {
        glPushMatrix();   
        Vector3 b=rotationaxis.begin;//rotationaxis is a Line variable, Line is a struct that has two points : begin and end , both are Vector3 variables
        Vector3 e=rotationaxis.end-b;//Vector3 has all the operators needed for vector maths(sum, crossproduct , length , anglebetween two vectors , etc)
        glTranslatef(centerofmass.X(),centerofmass.Y(),centerofmass.Z());//centerofmass is inherited from body and it's Vector3, Balls have their centerofmass at their origin
        glTranslatef(-b.X(),-b.Y(),-b.Z());
        glRotatef(thetarotate*180/pi,e.X(),e.Y(),e.Z());//thetarotate is an attribute calculated by physics , it is zero if you don't apply any angular acceleration
        glTranslatef(b.X(),b.Y(),b.Z());
        glutSolidSphere(radius,100,100);
        glPopMatrix();
    }

    rotationaxis is the axis I want to rotate the ball around(which is not assumed to be fixed), centerofmass is as its name applies, Balls have their centerofmass in their origin.

    The main.cpp file is this :
    Code :
    #include <iostream>
    #include <cmath>
    #include "ball.h"
    using namespace std;
    Ball ball(0.3,Vector3(0,0,0),0.5,0.01);//radius=0.3 , origin is in (0,0,0) , mass=0.5, dt(the time step)=0.01 seconds
    void init()
    {
        glClearColor(0,0,0,0);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();   
        glShadeModel(GL_SMOOTH);
    }
    void renderScene()
    {        
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
        glColor3f(1,1,1);
        glPushMatrix();
        ball.draw();
        glPopMatrix();
        glutSwapBuffers();
    }
    void changeSize(int width,int height)
    {
        glViewport(0,0,width,height);
    }
    void idle()
    {
        glutPostRedisplay();
    }
    void specialfunc(int key,int x,int y)
    {
        switch(key)
        {
    case GLUT_KEY_UP:
            ball.applyforce(Force(Vector3(0,0,1),2));//when pressing Up arrow , apply a force to the positive z direction(towards you the watcher of the screen) with strength of 2 newtons
        case GLUT_KEY_DOWN:
            ball.applyforce(Force(Vector3(0,0,-1),2));//when Down apply force in the opposite direction and the same strength
        case GLUT_KEY_LEFT:
            ball.applytorque(-4);//apply torque of -4 newton . meter, angularacceleration=torque/rotationalinertia , rotationalinertia of a ball=2*mass*radius*radius/5(from wikipedia) Those calculation are made in applytorque and angular velocity is changed according to angular acceleration and dt(angvel+=angacc*dt) and thetarotate+=angvel*dt, thetarotate is then maintained to be in the interval [-twopi,twopi]
        case GLUT_KEY_RIGHT:
            ball.applytorque(4);//the same but in the opposite direction
     
        }
    }
    int main(int argc, char **argv)
    {
        glutInit(&argc,argv);
        glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
        glutInitWindowPosition(100,100);
        glutInitWindowSize(320,320);
        glutCreateWindow("Lighthouse3D- GLUT Tutorial");
        init();   
        glutSpecialFunc(specialfunc);
        glutDisplayFunc(renderScene);
        glutReshapeFunc(changeSize);   
        glutIdleFunc(idle);
        glutMainLoop();
        return 0;
    }

    I'm sure the phyisical calculations are right(checked it by debug)

    Problem:

    the rotation doesn't work correctly, sometimes it rotate backwards(while I expect it to rotate forward), and when I stop pressing the right key for example it stops rotating, it shouldn't stop instantly because in real world it slows down due to friction and etc, I didn't program friction yet so it shouldn't stop at all until I apply a torque opposite to its rotation direction(By pressing the left button for example).

    I know the wrong is with the draw method but I can't figure it out, what's the problem ?

    Infos:

    I'm running linux mint and using Freeglut(not glut), also this is for a physics simulation project at university. I'll make the ball roll but first it should rotate.

    Last thing, applyforce is a function to apply a force on the ball with the specified direction(a Vector) and strength, this works very great, the rotation is the part that doesn't.

  2. #2
    Senior Member OpenGL Guru
    Join Date
    Jun 2013
    Posts
    2,729
    There's nothing fundamentally wrong with Ball:draw(), although whether it's actually correct depends upon the interpretation of the variables.

    One thing which is clearly wrong is that specialfunc() doesn't have any break statements within the switch statement.

  3. #3
    Member Regular Contributor
    Join Date
    Mar 2015
    Posts
    296
    Quote Originally Posted by GClements View Post
    There's nothing fundamentally wrong with Ball:draw(), although whether it's actually correct depends upon the interpretation of the variables.

    One thing which is clearly wrong is that specialfunc() doesn't have any break statements within the switch statement.
    So it is. no break or return statement at each case end.

  4. #4
    Newbie Newbie
    Join Date
    Apr 2015
    Posts
    2
    Now that's a killing mistake , you were right, that solved my problem , I'm really really sorry

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •