public override void RotationYawPitchRoll(Angle yaw, Angle pitch, Angle roll) { //if (World.Settings.Project == Projection.Perspective) //{ if (World.Settings.cameraHasMomentum) { _latitudeMomentum += pitch / 100; _longitudeMomentum += yaw / 100; _headingMomentum += roll / 100; } this._targetOrientation = Quaternion4d.EulerToQuaternion(yaw.Radians, pitch.Radians, roll.Radians) * _targetOrientation; Vector3d v = Quaternion4d.QuaternionToEulerV3D(_targetOrientation); if (!double.IsNaN(v.Y)) { this._targetLatitude.Radians = v.Y; this._targetLongitude.Radians = v.X; if (!World.Settings.cameraTwistLock) { _targetHeading.Radians = v.Z; } } base.RotationYawPitchRoll(yaw, pitch, roll); //} }
protected void SlerpToTargetOrientation(double percent) { double c = Quaternion4d.Dot(m_Orientation, _targetOrientation); if (c > 1.0) { c = 1.0; } else if (c < -1.0) { c = -1.0; } angle = Angle.FromRadians(Math.Acos(c)); m_Orientation = Quaternion4d.Slerp(m_Orientation, this._targetOrientation, percent); Vector3d v = Quaternion4d.QuaternionToEulerV3D(m_Orientation); if (!double.IsNaN(v.Y)) { this._latitude.Radians = v.Y; this._longitude.Radians = v.X; this._heading.Radians = v.Z; } this._tilt += (this._targetTilt - this._tilt) * percent; this._bank += (this._targetBank - this._bank) * percent; this._distance += (this._targetDistance - this._distance) * percent; ComputeAltitude(this._distance, this._tilt); this._fov += (this._targetFov - this._fov) * percent; }
public override void RotationYawPitchRoll(Angle yaw, Angle pitch, Angle roll) { if (!World.Settings.cameraSmooth) { base.RotationYawPitchRoll(yaw, pitch, roll); this._targetOrientation = m_Orientation; this._targetLatitude = _latitude; this._targetLongitude = _longitude; this._targetHeading = _heading; return; } _targetOrientation = Quaternion4d.EulerToQuaternion(yaw.Radians, pitch.Radians, roll.Radians) * _targetOrientation; Vector3d v = Quaternion4d.QuaternionToEulerV3D(_targetOrientation); if (!double.IsNaN(v.Y)) { this._targetLatitude.Radians = v.Y; } if (!double.IsNaN(v.X)) { this._targetLongitude.Radians = v.X; } if (Math.Abs(roll.Radians) > double.Epsilon) { this._targetHeading.Radians = v.Z; } }
public virtual void Update(Device device) { this.viewPort = device.Viewport; Vector3d p = Quaternion4d.QuaternionToEulerV3D(m_Orientation); if (!double.IsNaN(p.Y)) { this._latitude.Radians = p.Y; } if (!double.IsNaN(p.X)) { this._longitude.Radians = p.X; } if (!double.IsNaN(p.Z)) { this._heading.Radians = p.Z; } m_Orientation = Quaternion4d.EulerToQuaternion(_longitude.Radians, _latitude.Radians, _heading.Radians); ComputeProjectionMatrix(viewPort); ComputeViewMatrix(); Matrix proh = (Matrix)ConvertDX.FromMatrix4d(m_ProjectionMatrix); device.Transform.Projection = proh; device.Transform.View = (Matrix)ConvertDX.FromMatrix4d(m_ViewMatrix); //TODO JHJ 默认就是单位矩阵 //device.Transform.World = (Matrix)ConvertDX.FromMatrix4d(m_WorldMatrix); ViewFrustum.Update( Matrix4d.Multiply(m_WorldMatrix, Matrix4d.Multiply(m_ViewMatrix, m_ProjectionMatrix))); // Old view range (used in quadtile logic) double factor = (this._altitude) / this._worldRadius; if (factor > 1) { viewRange = Angle.FromRadians(Math.PI); } else { viewRange = Angle.FromRadians(Math.Abs(Math.Asin((this._altitude) / this._worldRadius)) * 2); } // True view range if (factor < 1) { trueViewRange = Angle.FromRadians(Math.Abs(Math.Asin((this._distance) / this._worldRadius)) * 2); } else { trueViewRange = Angle.FromRadians(Math.PI); } }
/// <summary> /// Pan the camera using delta values /// </summary> /// <param name="lat">Latitude offset</param> /// <param name="lon">Longitude offset</param> public override void Pan(Angle lat, Angle lon) { if (World.Settings.cameraHasMomentum) { _latitudeMomentum += lat / 100; _longitudeMomentum += lon / 100; } if (Angle.IsNaN(lat)) { lat = this._targetLatitude; } if (Angle.IsNaN(lon)) { lon = this._targetLongitude; } lat += _targetLatitude; lon += _targetLongitude; if (Math.Abs(lat.Radians) > Math.PI / 2 - 1e-3) { lat.Radians = Math.Sign(lat.Radians) * (Math.PI / 2 - 1e-3); } this._targetOrientation = Quaternion4d.EulerToQuaternion( lon.Radians, lat.Radians, _targetHeading.Radians); Vector3d v = Quaternion4d.QuaternionToEulerV3D(this._targetOrientation); if (!double.IsNaN(v.Y)) { _targetLatitude.Radians = v.Y; _targetLongitude.Radians = v.X; _targetHeading.Radians = v.Z; if (!World.Settings.cameraSmooth) { _latitude = _targetLatitude; _longitude = _targetLongitude; _heading = _targetHeading; m_Orientation = _targetOrientation; } } }
public virtual void RotationYawPitchRoll(Angle yaw, Angle pitch, Angle roll) { m_Orientation = Quaternion4d.EulerToQuaternion(yaw.Radians, pitch.Radians, roll.Radians) * m_Orientation; Vector3d p = Quaternion4d.QuaternionToEulerV3D(m_Orientation); if (!double.IsNaN(p.Y)) { _latitude.Radians = p.Y; } if (!double.IsNaN(p.X)) { _longitude.Radians = p.X; } if (Math.Abs(roll.Radians) > double.Epsilon) { _heading.Radians = p.Z; } }
/// <summary> /// Sets camera position. /// </summary> /// <param name="lat">Latitude in decimal degrees</param> /// <param name="lon">Longitude in decimal degrees</param> /// <param name="heading">Heading in decimal degrees</param> /// <param name="_altitude">Altitude above ground level in meters</param> /// <param name="tilt">Tilt in decimal degrees</param> /// <param name="bank">Camera bank (roll) in decimal degrees</param> public virtual void SetPosition(double lat, double lon, double heading, double _altitude, double tilt, double bank) { if (double.IsNaN(lat)) { lat = this._latitude.Degrees; } if (double.IsNaN(lon)) { lon = this._longitude.Degrees; } if (double.IsNaN(heading)) { heading = this._heading.Degrees; } if (double.IsNaN(bank)) { bank = this._bank.Degrees; } m_Orientation = Quaternion4d.EulerToQuaternion( SMath.DegreesToRadians(lon), SMath.DegreesToRadians(lat), SMath.DegreesToRadians(heading)); Vector3d p = Quaternion4d.QuaternionToEulerV3D(m_Orientation); _latitude.Radians = p.Y; _longitude.Radians = p.X; _heading.Radians = p.Z; if (!double.IsNaN(tilt)) { Tilt = Angle.FromDegrees(tilt); } if (!double.IsNaN(_altitude)) { this.Altitude = _altitude; } this.Bank = Angle.FromDegrees(bank); }
public override void SetPosition(double lat, double lon, double heading, double _altitude, double tilt, double bank) { if (double.IsNaN(lat)) { lat = this._latitude.Degrees; } if (double.IsNaN(lon)) { lon = this._longitude.Degrees; } if (double.IsNaN(heading)) { heading = this._heading.Degrees; } if (double.IsNaN(bank)) { bank = _targetBank.Degrees; } this._targetOrientation = Quaternion4d.EulerToQuaternion( SMath.DegreesToRadians(lon), SMath.DegreesToRadians(lat), SMath.DegreesToRadians(heading)); Vector3d v = Quaternion4d.QuaternionToEulerV3D(this._targetOrientation); this._targetLatitude.Radians = v.Y; this._targetLongitude.Radians = v.X; this._targetHeading.Radians = v.Z; if (!double.IsNaN(tilt)) { this.Tilt = Angle.FromDegrees(tilt); } if (!double.IsNaN(_altitude)) { Altitude = _altitude; } this.Bank = Angle.FromDegrees(bank); }
protected void NoSlerpToTargetOrientation() { m_Orientation = this._targetOrientation; Vector3d v = Quaternion4d.QuaternionToEulerV3D(m_Orientation); if (!double.IsNaN(v.Y)) { this._latitude.Radians = v.Y; this._longitude.Radians = v.X; this._heading.Radians = v.Z; } //TODO JHJ 修改参数传递问题 镜头可以指定开始位置 _targetLatitude = _latitude; _targetLongitude = _longitude; _targetHeading = _heading; this._tilt = this._targetTilt; this._bank = this._targetBank; this._distance = this._targetDistance; ComputeAltitude(this._distance, this._tilt); this._fov = this._targetFov; }
/// <summary> /// Pan the camera using delta values /// </summary> /// <param name="lat">Latitude offset</param> /// <param name="lon">Longitude offset</param> public virtual void Pan(Angle lat, Angle lon) { if (Angle.IsNaN(lat)) { lat = this._latitude; } if (Angle.IsNaN(lon)) { lon = this._longitude; } lat += _latitude; lon += _longitude; // this._orientation = SMath.EulerToQuaternion( // lon.Radians, // lat.Radians, // _heading.Radians); m_Orientation = Quaternion4d.EulerToQuaternion( lon.Radians, lat.Radians, _heading.Radians); Vector3d p = Quaternion4d.QuaternionToEulerV3D(m_Orientation); // Vector3d v = SMath.QuaternionToEuler(this._orientation); // if(!double.IsNaN(v.Y)) // { // this._latitude.Radians = v.Y; // this._longitude.Radians = v.X; // } if (!double.IsNaN(p.Y)) { _latitude.Radians = p.Y; _longitude.Radians = p.X; } }