Main Menu

Suggestions for Next Release

Started by AGP, August 16, 2006, 10:27:33 PM

Previous topic - Next topic

AGP

Apart from better lighting controls (already promised in the docs), how about a Camera.follow(Object3D)? Could either start its own thread, or take the Object3D's current position plus the camera's delta from it once. That would be cool.

EgonOlsen

The improved light source handling is already done and will be part of the next release. It'll leave the current implementation untouched but adds a little helper class to the util-package that wraps each light into an object. Handling is much better with this IMHO.
About the camera stuff...i'm not really sure if i fully understand what to want this method to do!?

AGP

Just that: follow an object. Like the camera follows the X-Wing in the Rogue Squadron series, or like you would want a camera following a character who is walking around an environment (over the shoulder) for an RPG. Example of the camera following the x-wing:


AGP

Egon, Can I take your lack of response to indicate that you aprove of my camera suggestion?

EgonOlsen

No, you can indicate that as my lack of time due to the fact that i have to install my new Core2 Duo machine... :wink:
Anyway, i don't think that such a method belongs into the engine. It depends too much on the game's/application's needs IMHO. The car example already contains an example on how to do something like this and so do the Paradroidz sources. I don't think there is a generic solution to this that fits everyones needs.

AGP

Yes, but a lot of the things you put in an engine don't fit everyone's needs. This would be very cool because camera-handling is always a pain-in-the-ass.

Anyway, I was thinking about it and you would need two methods. A Camera.set(Object3D) indicating that the camera's position relative to the object has been set, and the aforementioned Camera.follow(Object3D). Pretty please?

EgonOlsen

Some stuff may not fit everyones needs, but if it does...it does. That's not the case with camera stuff IMO. Take Camera.follow(Object3D) as an example: What should that method do? move the camera behind the object? In which distance? With which viewing angle? How should it react to acceleration? How to deceleration? How to rotations? Should it just "stick" onto the object or have a "flow"? Should it collide with obstacles or not? What should be done, if it does?
A method that handles all this has to have a lot of configuration variables...i don't think, that it's worth it. However, i'll think about some camera related stuff for the util-package to decouple it from the engine's core.

AGP

I just answered all your questions: you would set the distance and angle, then call Camera.set(Object3D). From then on, you would call Camera.follow(Object3D) which would adjust its position relative to the object as if it were being pulled by a stick.

EgonOlsen

That's simple:

   
SimpleVector center=object.getTransformedCenter();
SimpleVector camPos=new SimpleVector(center);
SimpleVector zOffset=object.getZAxis();
SimpleVector yOffset=object.getYAxis();
zOffset.scalarMul(-100f);
yOffset.scalarMul(60f);
camPos.add(zOffset);
camPos.add(yOffset);
camera.setPosition(camPos);
camera.lookAt(center);


That should work. But as you can see, it doesn't take collisions into account (for example) and it can't do that in a generic way. But a lot of people will need that, so i still think you're better off with your own, tailored method. But i'll add some stuff like this into util. I'm just not sure that it'll make it into the next release.

AGP

That's neither set() nor follow(). Follow has to consider the camera's previous settings (as determined by set()).

They would be two cool methods to have but if you won't include them I'll be happy to get their respective codes from you. :-)

Seriously I'll be grateful for any help.

EgonOlsen

Quote from: "AGP"That's neither set() nor follow(). Follow has to consider the camera's previous settings (as determined by set()).
No, it's both. The position is determined by the -100 (in z-direction) and the 60 (in y-direction). The lookAt makes you look at the objects center (or whatever point you put in there). Call this every frame and it should do what you want. If it doesn't, then i'm still not getting what you want.

AGP

Just so you don't think I'm a moron, I believe my problem comes from adjusting the camera before building all the objects. Building the objects just seems like the last thing to do when initializing. I still think that the set() and follow() methods are useful, but I understand your position.

EgonOlsen

Maybe this will help. It doesn't work with angles directly, because that will cause a lot more math to be involved. The set()-method needs a camera position and an initial lookAt position in world space (if you want to work with angles, derive the lookAt from the position and the angles). Then call follow() each frame. It may do, what you want.

import com.threed.jpct.*;

public class Follower {
 
  private SimpleVector initial=null;
  private SimpleVector angles=null;
  private SimpleVector offsets=null;
  private SimpleVector lookAt=null;
  private boolean firstRun=true;
 
  public Follower() {
     initial=new SimpleVector();
  }
 
  public void set(SimpleVector start, SimpleVector lookAt) {
     initial=start;
     this.angles=angles;
     this.lookAt=lookAt;
  }
 
  public void follow(Object3D obj, Camera cam) {
     if (firstRun) {
        SimpleVector c=obj.getTransformedCenter();
        offsets=initial.calcSub(c);
        lookAt=lookAt.calcSub(c);
        firstRun=false;
     }
     
     SimpleVector center=obj.getTransformedCenter();
     SimpleVector camPos=new SimpleVector(center);
     SimpleVector zOffset=obj.getZAxis();
     SimpleVector yOffset=obj.getYAxis();
     SimpleVector xOffset=obj.getXAxis();
     zOffset.scalarMul(offsets.z);
     yOffset.scalarMul(offsets.y);
     xOffset.scalarMul(offsets.x);
     
     SimpleVector zlookOffset=obj.getZAxis();
     SimpleVector ylookOffset=obj.getYAxis();
     SimpleVector xlookOffset=obj.getXAxis();

     SimpleVector look=new SimpleVector(center);
     zlookOffset.scalarMul(lookAt.z);
     ylookOffset.scalarMul(lookAt.y);
     xlookOffset.scalarMul(lookAt.x);
     look.add(zlookOffset);
     look.add(xlookOffset);
     look.add(ylookOffset);
     
     camPos.add(zOffset);
     camPos.add(yOffset);
     camPos.add(xOffset);
     cam.setPosition(camPos);
     cam.lookAt(look);
  }
}

AGP

Thanks a lot. I'm about to try it out.

But how about a public Camera Object3D.lookThrough()? That way you could set an invisible object as your camera. That's probably insanely easy to do, and you could just addChild(cameraObject) to another object. You have to admit that is very useful. How about it?

EgonOlsen


camera.setBack(obj.getWorldTransformation().invert3x3());
camera.setPosition(obj.getTransformedCenter());
 :?: