Changing Near plane leads to weird "reproject" results

Started by atreyu64, March 14, 2016, 12:23:18 AM

Previous topic - Next topic

atreyu64

Hi boys and boys,

I've noticed a strange behaviour when I modify the near plane value.
In my apps I have two types of camera controls (and I can switch from one to another at any time) : orbit camera and "walk camera" meaning that the camera is very close to the ground, which of course leads to some "frustum" effects.
Here is basically what I do to avoid this problem when I change the camera control type :

if(walkMode) {
Config.nearPlane = 0.25f;
Config.farPlane = 10000000000f; // yes I want to see everything...
}
else { // orbit camera settings :
Config.nearPlane = 1f;
Config.farPlane = 1000f;
}
cam.setFOVtoDefault();
cam.adjustFovToNearPlane();


I thought that adjustFovToNearPlane function would be enough but I also had to call setFOVtoDefault to avoid zoom-in/zoom-out effets, but this is not a problem, it solves my frustum problem very well.

The problem is that when the near plane value is different than the default value, the calcMinDistanceAndObject3D method returns wrong results.
Indeed, when I call the following method, I get wrong results :

// cursor projection on terrain :
protected SimpleVector getCursorProjection(int x, int y) {
SimpleVector cursorProjection = null;
SimpleVector dir = Interact2D.reproject2D3DWS(cam, fb, x, y).normalize();
Object[] res = world.calcMinDistanceAndObject3D(cam.getPosition(), dir, 1000000);
Object3D pickedObject = (Object3D) res[1];
if(pickedObject == terrain) {
float distance = (Float) res[0];
cursorProjection = dir;
cursorProjection.scalarMul(distance);
cursorProjection.add(cam.getPosition());
}

return cursorProjection;
}


The method still returns something, but it's like if the coordinate system of the frame buffer was different. Maybe the near plane value is not taken into account in the reproject2D3DWS method. Or maybe I'm doing something wrong ?...

Thanks in advance for your answers, cheers,


Sylvain

EgonOlsen

No, it doesn't take the near plane into account that way (because it doesn't have it). You might want to try the method that takes a z-value in addition (documented as "the z position in camera space") and fill that with the value for the near plane.

This whole clipping plane thing is rather poorly designed. The next version will move the setting from the World to the Camera, where it actually belongs. And then, these methods should work fine again.

Please let me know, if the method with "z" fixes the problem.

EgonOlsen

Thinking some more about it, I think what the method does is actually correct. It's more likely an issue with the frustum calculation itself at that stage. I'll look into it. You can try my former suggestion though, but I don't think that it's the right solution!

EgonOlsen

I think I found the problem. I'll upload a fixed version later.

EgonOlsen

Please give this version a try with your present code and see if that helps: http://jpct.de/download/beta/jpct.jar

atreyu64

The reprojection function now works great, thanks a lot !

But I still have a problem : the method Interact2D.project3D2D returns wrong values.

EgonOlsen

Might be a related issue. I'll look into it tomorrow.

EgonOlsen

Yes, it's the same issue. I'll upload a fixed version later today.

EgonOlsen

I've updated the jar file that I linked to above. Please give it a try.

atreyu64

Everything works perfectly now. Thanks a lot !
Do you plan to report the corrections on jpct-AE ?

Cheers, thanks again for your precious time.

EgonOlsen

Quote from: atreyu64 on March 15, 2016, 10:39:57 PM
Do you plan to report the corrections on jpct-AE ?
Yes, sure. I just haven't uploaded a fixed jar for it. Do you need it?

atreyu64

Yes I would need it, but no worries, I'm not in a hurry.

atreyu64


EgonOlsen

Ahem..no. I'll try to upload it later today. But that version is heavy WIP, so be prepared for some mayhem.

EgonOlsen

Ok, here it is: http://jpct.de/download/beta/jpct_ae.jar

As said, it's WIP. Mainly because it already contains the new shadow stuff that I'm doing for the next version. But I'm using this version in the latest Naroth release as well, so it should be stable.