Weird right?
Here is a temporary fix, using angle and position tresholds :
public function hover(jumpTo:Boolean = false):Boolean
{
var angleTreshold:Number = 0.1;
var positionTreshold:Number = 0.1;
var camUpdated = false;
if (tiltAngle != _currentTiltAngle || panAngle != _currentPanAngle) {
tiltAngle = Math.max(minTiltAngle, Math.min(maxTiltAngle,
tiltAngle));
panAngle = Math.max(minPanAngle, Math.min(maxPanAngle,
panAngle));
if (wrapPanAngle) {
if (panAngle < 0)
panAngle = (panAngle % 360) + 360;
else
panAngle = panAngle % 360;
if (panAngle - _currentPanAngle < -180)
panAngle += 360;
else if (panAngle - _currentPanAngle > 180)
panAngle -= 360;
}
if (jumpTo) {
_currentTiltAngle = tiltAngle;
_currentPanAngle = panAngle;
} else {
_currentTiltAngle += (tiltAngle -
_currentTiltAngle)/(steps + 1);
_currentPanAngle += (panAngle -
_currentPanAngle)/(steps + 1);
}
//snap coords if angle differences are close
if ((Math.abs(tiltAngle - _currentTiltAngle) < angleTreshold) &&
(Math.abs(panAngle - _currentPanAngle) < angleTreshold)) {
_currentTiltAngle = tiltAngle;
_currentPanAngle = panAngle;
}
camUpdated = true;
}
var gx:Number = target.x +
distance*Math.sin(_currentPanAngle*toRADIANS)*Math.cos(_currentTiltAngle*toRADIANS);
var gz:Number = target.z +
distance*Math.cos(_currentPanAngle*toRADIANS)*Math.cos(_currentTiltAngle*toRADIANS);
var gy:Number = target.y +
distance*Math.sin(_currentTiltAngle*toRADIANS)*yfactor;
if ((Math.abs(x - gx) >= positionTreshold) || (Math.abs(y - gy) >=
positionTreshold) || (Math.abs(z - gz) >= positionTreshold)) {
x = gx;
y = gy;
z = gz;
camUpdated = true;
}
return camUpdated;
}
Not perfect but hey it works.
Waiting for an opinion... thanks.
Nicolas
On 7 jan, 20:23, nlorut <[email protected]> wrote:
> Hi,
> Congrats for your amazing work.
> I have recently updated the trunk, and it seems HoverCamera3D.hover()
> doesn't return 'false' anymore.
> In order to figure this out, here are a few test lines i wrote in
> HoverCamera3D.as :
>
> "[...]
> var gx:Number = target.x +
> distance*Math.sin(_currentPanAngle*toRADIANS)*Math.cos(_currentTiltAngle*toRADIANS);
> var gz:Number = target.z +
> distance*Math.cos(_currentPanAngle*toRADIANS)*Math.cos(_currentTiltAngle*toRADIANS);
> var gy:Number = target.y +
> distance*Math.sin(_currentTiltAngle*toRADIANS)*yfactor;
>
> //test// trace ("x (" + x + ") == gx (" + gx + ") ?");
> //test// trace ("y (" + y + ") == gy (" + gy + ") ?");
> //test// trace ("z (" + z + ") == gz (" + gz + ") ?");
>
> if ((x == gx) && (y == gy) && (z == gz))
> return false;
>
> x = gx;
> y = gy;
> z = gz;
>
> //test// trace ("x final = " + x);
> //test// trace ("y final = " + y);
> //test// trace ("z final = " + z);
>
> return true;
> [...]"
>
> And here is what i get in the output, as the camera is no longer
> updated :
>
> "[...]
> x (7852.2958984375) == gx (7852.296056215698) ?
> y (6446.26171875) == gy (6446.2618632336935) ?
> z (9358.001953125) == gz (9358.002035108404) ?
> x final = 7852.2958984375
> y final = 6446.26171875
> z final = 9358.001953125
> camHasMoved ? true
> x (7852.2958984375) == gx (7852.296056215698) ?
> y (6446.26171875) == gy (6446.2618632336935) ?
> z (9358.001953125) == gz (9358.002035108404) ?
> x final = 7852.2958984375
> y final = 6446.26171875
> z final = 9358.001953125
> camHasMoved ? true
> ..."
>
> It seems there is a decimal precision problem between gx/gy/gz Numbers
> (12) and x/y/z cam properties (10).
>
> What do you think?
> Thanks in advance for your help.
> Nicolas