Author Topic: Object3D rotation around another object  (Read 5575 times)

Offline aerosolswe

  • byte
  • *
  • Posts: 2
    • View Profile
Object3D rotation around another object
« on: October 19, 2012, 02:42:42 am »
Hello.

So I am really new with jpct-ae (and only been programming for 1yr). I am currently working on my first app with it, so far loving it. But I've struggled with this task all night and I cant seem to get it work.

The game plays out in the solar system and atm I am making the planets orbit around the sun but I cant find a good way to do this. Tried some with sin and cos but nothing really worked.

So I am wondering if anyone else got some tips for me how I am suppose to do this.

Appreciate all the help and tips. Thanks.

Offline EgonOlsen

  • Administrator
  • quad
  • *****
  • Posts: 12295
    • View Profile
    • http://www.jpct.net
Re: Object3D rotation around another object
« Reply #1 on: October 19, 2012, 07:17:17 am »
You can set a dummy object (http://www.jpct.net/doc/com/threed/jpct/Object3D.html#createDummyObj()) in the sun's center (or one for each planet), make it a child of the planet and rotate the dummy around Y to make the planet orbit the sun.

Offline aerosolswe

  • byte
  • *
  • Posts: 2
    • View Profile
Re: Object3D rotation around another object
« Reply #2 on: October 19, 2012, 02:26:24 pm »
Thank you egon, I will have a go with that

Offline phmenard

  • byte
  • *
  • Posts: 8
    • View Profile
Re: Object3D rotation around another object
« Reply #3 on: September 08, 2013, 11:19:09 pm »
I took your advice and its not working ... I do this in
onSurfaceChanged()

Code: [Select]
center = Object3D.createDummyObj();
center.translate(sol[0].getTransformedCenter());
center.build();

earth[0].translate(0, 50, 0);
earth[0].setTexture("texture");
earth[0].addChild(center);

and in onDrawFrame()

Code: [Select]
center.rotateY(1f);

but nothing happends ... whats am I doing wrong?? the sol and earth objects are loaded obj models.

Offline EgonOlsen

  • Administrator
  • quad
  • *****
  • Posts: 12295
    • View Profile
    • http://www.jpct.net
Re: Object3D rotation around another object
« Reply #4 on: September 08, 2013, 11:23:30 pm »
The earth should be the child of the center to make this work, not the other way.

Offline phmenard

  • byte
  • *
  • Posts: 8
    • View Profile
Re: Object3D rotation around another object
« Reply #5 on: September 09, 2013, 12:31:40 am »
ok did that ... now the earth is just sitting there spinning rather that rotating around the center ... hmm ... any advice??

Offline EgonOlsen

  • Administrator
  • quad
  • *****
  • Posts: 12295
    • View Profile
    • http://www.jpct.net
Re: Object3D rotation around another object
« Reply #6 on: September 09, 2013, 06:53:19 am »
Sounds like as if you are rotating the earth now....create the center, maek earth a child of it and then rotate the center, not the earth.

Offline phmenard

  • byte
  • *
  • Posts: 8
    • View Profile
Re: Object3D rotation around another object
« Reply #7 on: September 10, 2013, 12:07:50 am »
silly me ... works perfect ... just need to rotate on the z axis not the y. What's up with these dummy objects any way??? are they costly to have around?? ... example ... a model of our solar system would require 9 dummy objects to control the orbits of each planet given that they orbit and rotate at different speeds.0 ... would it be better to use some old school math???

kinda off topic but while I'm here ... is there a way to make an abject glow .. like a sun ... texture effect maybe??

thanks a bunch for your help EgonOlsen

Offline EgonOlsen

  • Administrator
  • quad
  • *****
  • Posts: 12295
    • View Profile
    • http://www.jpct.net
Re: Object3D rotation around another object
« Reply #8 on: September 10, 2013, 08:44:59 am »
... would it be better to use some old school math???
No. Dummy objects are cheap.

kinda off topic but while I'm here ... is there a way to make an abject glow .. like a sun ... texture effect maybe??
Maybe a glow texture with an alpha mask placed on a billboarded quad in the center of the sun will look good enough?

Offline phmenard

  • byte
  • *
  • Posts: 8
    • View Profile
Re: Object3D rotation around another object
« Reply #9 on: September 13, 2013, 06:29:41 pm »
ok thanks ... before I end this thread what would be the best way to go about making an elliptical orbit rather than a circle given the fact most planets don't orbit in a perfect circle ... I playing around with code like this but I'm not able to get it right.

Code: [Select]

SimpleVector sv = new SimpleVector();
sv.x = (float) (myOrbit.getTransformedCenter().x + Math.sin(myOrbitAngle*Math.PI/180) * Math.cos(myOrbitAngle*Math.PI/180));
sv.y = (float) (myOrbit.getTransformedCenter().y  + Math.sin(myOrbitAngle*Math.PI/180));// * Math.sin(.5));
//sv.z = (float) (myOrbit.getTransformedCenter().z  + Math.cos(myOrbitAngle*Math.PI/180));


myOrbitAngle += myOrbitSpeed; 

myObject.translate(sv);


Offline EgonOlsen

  • Administrator
  • quad
  • *****
  • Posts: 12295
    • View Profile
    • http://www.jpct.net
Re: Object3D rotation around another object
« Reply #10 on: September 13, 2013, 08:20:11 pm »
Translations are cumulative. Try something like

Code: [Select]
myObject.clearTranslation();
myObject.translate(sv);

instead.

Offline phmenard

  • byte
  • *
  • Posts: 8
    • View Profile
Re: Object3D rotation around another object
« Reply #11 on: September 13, 2013, 08:42:56 pm »
using the method myObject.clearTranslation(); results in the object not being drawn for some reason ... I have this ..

Code: [Select]
SimpleVector sv = new SimpleVector();
 
myOrbitAngle += myOrbitSpeed;
        if(myOrbitAngle > Math.PI * 2)
        myOrbitAngle %= Math.PI * 2;

sv.x = (float) ((Math.cos(myOrbitAngle)) + myOrbit.getTransformedCenter().x);
sv.y = (float) ((Math.sin(myOrbitAngle)) +  myOrbit.getTransformedCenter().y);
    sv.z =  myOrbit.getTransformedCenter().z;

    //myObject.clearTranslation();
    myObject.translate(sv);

the planet clearly orbits in an elliptical fashion ... but not around it orbit center(myOrbit) I'm missing something ...

Offline EgonOlsen

  • Administrator
  • quad
  • *****
  • Posts: 12295
    • View Profile
    • http://www.jpct.net
Re: Object3D rotation around another object
« Reply #12 on: September 13, 2013, 09:15:16 pm »
Shouldn't the sin and cos values being multiplied by some values? This way, your translation hovers around +-1 around the orbit's center!?

Offline phmenard

  • byte
  • *
  • Posts: 8
    • View Profile
Re: Object3D rotation around another object
« Reply #13 on: September 13, 2013, 09:56:19 pm »
I thought and seen the same thing ... so now I have this ..

Code: [Select]
SimpleVector sv = new SimpleVector();
 
myOrbitAngle += myOrbitSpeed;
        if(myOrbitAngle > Math.PI * 2)
        myOrbitAngle %= Math.PI * 2;

sv.z = (float) ((Math.cos(myOrbitAngle * distanceFromParent)) + myOrbit.getTransformedCenter().z);
sv.x = (float) ((Math.sin(myOrbitAngle * distanceFromParent)) +  myOrbit.getTransformedCenter().x);
    sv.y =  myOrbit.getTransformedCenter().y;

    //myObject.clearTranslation();
    myObject.translate(sv);

but still off center ... I'll get it ... lol

Offline phmenard

  • byte
  • *
  • Posts: 8
    • View Profile
Re: Object3D rotation around another object
« Reply #14 on: September 15, 2013, 06:51:36 pm »
why is it that the following code will not orbit the orbitCenter ... instead its starts off ok but then dives right into orbitCenter and continues to do so ...

Code: [Select]
SimpleVector sv = new SimpleVector();
 
myOrbitAngle += myOrbitSpeed;
        if(myOrbitAngle > Math.PI * 2)
        myOrbitAngle %= Math.PI * 2;

        //float rad = (float) (myOrbitAngle * (Math.PI / 180)); // Converting Degrees To Radians
        sv.x = (float) (orbitCenter.x + distanceFromParent * Math.sin(myOrbitAngle));
        sv.z = (float) (orbitCenter.z + distanceFromParent * Math.cos(myOrbitAngle));

   


Log.w("pos", sv.toString() );
myObject.translate(sv);

myObject.rotateY(myOrbitSpeed);
« Last Edit: September 15, 2013, 07:02:52 pm by phmenard »