| 38 |
private PerspectiveCamera _camera; |
private PerspectiveCamera _camera; |
| 39 |
private Point3D _cameraLookPoint; |
private Point3D _cameraLookPoint; |
| 40 |
private RotateTransform3D _rotationTransform = new RotateTransform3D(); |
private RotateTransform3D _rotationTransform = new RotateTransform3D(); |
| 41 |
ModelVisual3D clickedVisual; |
//ModelVisual3D clickedVisual; |
| 42 |
|
ModelVisual3D visul3d; |
| 43 |
|
|
| 44 |
Transform3DGroup clickedtransformGroup; |
//rotate and pan object clicked |
| 45 |
private TranslateTransform3D _clickedTranslate = new TranslateTransform3D(); |
private TranslateTransform3D _clickedTranslate ;//= new TranslateTransform3D(); |
| 46 |
private TranslateTransform3D _clickedTranslateOriginal = new TranslateTransform3D(); |
private TranslateTransform3D _clickedTranslateOriginal;// = new TranslateTransform3D(); |
| 47 |
private RotateTransform3D _clickedRotate = new RotateTransform3D(); |
private RotateTransform3D _clickedRotate ;//= new RotateTransform3D(); |
| 48 |
private AxisAngleRotation3D _clickedAxisAngleRotate = new AxisAngleRotation3D(); |
private AxisAngleRotation3D _clickedAxisAngleRotate = new AxisAngleRotation3D(); |
| 49 |
|
Point3D _clickedCenterPosition; |
| 50 |
|
|
| 51 |
|
|
| 52 |
bool isTracking = false; |
bool isTracking = false; |
| 53 |
|
|
| 62 |
_transform.Children.Add(_rotationTransform); |
_transform.Children.Add(_rotationTransform); |
| 63 |
// _transform.Children.Add(_scale); |
// _transform.Children.Add(_scale); |
| 64 |
|
|
| 65 |
//for pan and rotate the object |
// _clickedRotate.Rotation = _clickedAxisAngleRotate; |
|
|
|
|
//clickedtransformGroup = new Transform3DGroup(); |
|
|
//clickedtransformGroup.Children.Add(_clickedRotate); |
|
|
//clickedtransformGroup.Children.Add(_clickedTranslate); |
|
| 66 |
} |
} |
| 67 |
|
|
| 68 |
/// <summary> |
/// <summary> |
| 136 |
if (result3d == null) |
if (result3d == null) |
| 137 |
return; |
return; |
| 138 |
|
|
| 139 |
ModelVisual3D visul3d = result3d.VisualHit as ModelVisual3D; |
visul3d = result3d.VisualHit as ModelVisual3D; |
| 140 |
if (visul3d == null) |
if (visul3d == null) |
| 141 |
return; |
return; |
| 142 |
|
|
| 143 |
Transform3DGroup group = visul3d.Transform as Transform3DGroup; |
Transform3DGroup group = visul3d.Transform as Transform3DGroup; |
| 144 |
if (group != null) |
if (group != null) |
| 145 |
{ |
{ |
| 146 |
if (group.Children[0] != null) |
foreach (Transform3D tran in group.Children) |
| 147 |
|
{ |
| 148 |
|
if (tran is RotateTransform3D) |
| 149 |
{ |
{ |
| 150 |
|
_clickedRotate = new RotateTransform3D(); |
| 151 |
_clickedRotate = group.Children[0] as RotateTransform3D; |
_clickedRotate = group.Children[0] as RotateTransform3D; |
| 152 |
|
if (_clickedRotate != null) |
| 153 |
|
{ |
| 154 |
|
_clickedAxisAngleRotate = new AxisAngleRotation3D(); |
| 155 |
_clickedRotate.Rotation = _clickedAxisAngleRotate; |
_clickedRotate.Rotation = _clickedAxisAngleRotate; |
| 156 |
} |
} |
| 157 |
if (group.Children[1] !=null) |
} |
| 158 |
|
else if (tran is TranslateTransform3D) |
| 159 |
_clickedTranslate = group.Children[1] as TranslateTransform3D; |
_clickedTranslate = group.Children[1] as TranslateTransform3D; |
| 160 |
} |
} |
| 161 |
//if (_clickedTranslate == null) |
} |
| 162 |
// return; |
else |
| 163 |
|
return; |
| 164 |
|
|
| 165 |
|
|
| 166 |
//for pan the object |
//for pan the object |
| 167 |
clickedVisual = visul3d; |
//clickedVisual = visul3d; |
| 168 |
//clickedVisual.Transform = _clickedRotate;// clickedtransformGroup;// _clickedTranslate; |
//visul3d.Transform = group; |
| 169 |
_clickedTranslateOriginal = _clickedTranslate.Clone(); |
_clickedTranslateOriginal = _clickedTranslate.Clone(); |
| 170 |
|
|
| 171 |
|
|
| 179 |
_rotationTransform.CenterZ = _cameraLookPoint.Z; |
_rotationTransform.CenterZ = _cameraLookPoint.Z; |
| 180 |
|
|
| 181 |
//for rotate the object mouse clicked |
//for rotate the object mouse clicked |
|
_clickedRotate.CenterX = _cameraLookPoint.X; |
|
|
_clickedRotate.CenterY = _cameraLookPoint.Y; |
|
|
_clickedRotate.CenterZ = _cameraLookPoint.Z; |
|
| 182 |
|
|
| 183 |
|
_clickedRotate.CenterX = _clickedCenterPosition.X = visul3d.Content.Bounds.Location.X + visul3d.Content.Bounds.SizeX / 2; |
| 184 |
|
_clickedRotate.CenterY = _clickedCenterPosition.Y = visul3d.Content.Bounds.Location.Y + visul3d.Content.Bounds.SizeY / 2; |
| 185 |
|
_clickedRotate.CenterZ = _clickedCenterPosition.Z = visul3d.Content.Bounds.Location.Z + visul3d.Content.Bounds.SizeZ / 2; |
| 186 |
|
|
| 187 |
_cameraLookDirection = Point3D.Subtract(_cameraLookPoint, _camera.Position); |
_cameraLookDirection = Point3D.Subtract(_cameraLookPoint, _camera.Position); |
| 188 |
_camera.LookDirection = _cameraLookDirection; |
_camera.LookDirection = _cameraLookDirection; |
| 204 |
Mouse.Capture(EventSource, CaptureMode.None); |
Mouse.Capture(EventSource, CaptureMode.None); |
| 205 |
isTracking = false; |
isTracking = false; |
| 206 |
|
|
| 207 |
//_clickedRotate = null; |
Transform3DGroup clickedtransformGroup = new Transform3DGroup(); |
| 208 |
//_clickedAxisAngleRotate = null; |
clickedtransformGroup.Children.Add(_clickedRotate); |
| 209 |
//_clickedTranslate = null; |
clickedtransformGroup.Children.Add(_clickedTranslate); |
| 210 |
//_clickedTranslateOriginal = null; |
|
| 211 |
|
visul3d.Transform = clickedtransformGroup; |
| 212 |
|
|
| 213 |
|
|
| 214 |
|
|
| 215 |
_eventSource.ReleaseMouseCapture(); |
_eventSource.ReleaseMouseCapture(); |
| 216 |
_eventSource.Cursor = Cursors.Arrow; |
_eventSource.Cursor = Cursors.Arrow; |
| 259 |
|
|
| 260 |
private void RotateObject(Point currentPosition) |
private void RotateObject(Point currentPosition) |
| 261 |
{ |
{ |
| 262 |
|
Vector3D currentPosition3D = ProjectToTrackball(EventSource.ActualWidth, EventSource.ActualHeight, currentPosition); |
|
//double axisAngle = currentPosition.X - _previousPosition2D.X; |
|
|
//double angletimes = axisAngle; |
|
|
|
|
|
//if (angletimes > 360 || angletimes < -360) |
|
|
// angletimes = 0; |
|
|
|
|
|
//if (angletimes + _clickedAxisAngleRotate.Angle >= 360) |
|
|
// _clickedAxisAngleRotate.Angle = 0; |
|
|
|
|
|
Vector3D currentPosition3D = ProjectToTrackball(clickedVisual.Content.Bounds.SizeX, clickedVisual.Content.Bounds.SizeZ, |
|
|
/*EventSource.ActualWidth, EventSource.ActualHeight, */currentPosition); |
|
| 263 |
|
|
| 264 |
Vector3D axis = Vector3D.CrossProduct(_previousPosition3D, currentPosition3D); |
Vector3D axis = Vector3D.CrossProduct(_previousPosition3D, currentPosition3D); |
| 265 |
double angle = Vector3D.AngleBetween(_previousPosition3D, currentPosition3D); |
double angle = Vector3D.AngleBetween(_previousPosition3D, currentPosition3D); |
| 266 |
Quaternion delta = new Quaternion(axis, -angle); |
Quaternion delta = new Quaternion(axis, -angle); |
| 267 |
|
|
| 268 |
// Get the current orientantion from the RotateTransform3D |
// Get the current orientantion from the RotateTransform3D |
| 269 |
AxisAngleRotation3D r = _rotation; |
Quaternion q = new Quaternion(_clickedAxisAngleRotate.Axis, _clickedAxisAngleRotate.Angle); |
|
Quaternion q = new Quaternion(_rotation.Axis, _rotation.Angle); |
|
| 270 |
|
|
| 271 |
// Compose the delta with the previous orientation |
// Compose the delta with the previous orientation |
| 272 |
q *= delta; |
q *= delta; |
| 273 |
|
|
|
|
|
|
_clickedRotate.CenterX = _cameraLookPoint.X; |
|
|
_clickedRotate.CenterY = _cameraLookPoint.Y; |
|
|
_clickedRotate.CenterZ = _cameraLookPoint.Z; |
|
|
|
|
| 274 |
// Write the new orientation back to the Rotation3D |
// Write the new orientation back to the Rotation3D |
|
_clickedAxisAngleRotate.Axis = q.Axis; |
|
|
_clickedAxisAngleRotate.Angle += q.Angle; |
|
| 275 |
|
|
| 276 |
|
_clickedAxisAngleRotate.Axis = q.Axis; |
| 277 |
|
_clickedAxisAngleRotate.Angle += q.Angle/4; |
| 278 |
|
if (_clickedAxisAngleRotate.Angle >= 360) |
| 279 |
|
_clickedAxisAngleRotate.Angle = 0; |
| 280 |
|
|
| 281 |
_previousPosition3D = currentPosition3D; |
_previousPosition3D = currentPosition3D; |
|
|
|
|
//_clickedAxisAngleRotate.Axis = new Vector3D(0, 0, 1); |
|
|
//_clickedAxisAngleRotate.Angle += axisAngle; |
|
| 282 |
} |
} |
| 283 |
|
|
| 284 |
private Vector3D ProjectToTrackball(double width, double height, Point point) |
private Vector3D ProjectToTrackball(double width, double height, Point point) |
| 301 |
{ |
{ |
| 302 |
LineRange range; |
LineRange range; |
| 303 |
ViewportInfo.Point2DtoPoint3D(_eventSource as Viewport3D, currentPosition, out range); |
ViewportInfo.Point2DtoPoint3D(_eventSource as Viewport3D, currentPosition, out range); |
| 304 |
Point3D pointNew = range.PointFromY(clickedVisual.Content.Bounds.Y); |
Point3D pointNew = range.PointFromY(_clickedCenterPosition.Y); |
| 305 |
|
|
| 306 |
//_camera.Position. |
//_camera.Position. |
| 307 |
} |
} |
| 319 |
|
|
| 320 |
LineRange range; |
LineRange range; |
| 321 |
ViewportInfo.Point2DtoPoint3D(_eventSource as Viewport3D, currentPosition, out range); |
ViewportInfo.Point2DtoPoint3D(_eventSource as Viewport3D, currentPosition, out range); |
| 322 |
Point3D pointNew = range.PointFromY(clickedVisual.Content.Bounds.Y); |
Point3D pointNew = range.PointFromY(_clickedCenterPosition.Y); |
| 323 |
|
|
| 324 |
Vector3D vectMouse = pointNew - _cameraLookPoint; |
Vector3D vectMouse = pointNew - _cameraLookPoint; |
| 325 |
_clickedTranslate.OffsetX = _clickedTranslateOriginal.OffsetX + vectMouse.X; |
//vectMouse = Vector3D.Multiply(_cameraLookDirection, visul3d.Transform.Value); |
| 326 |
_clickedTranslate.OffsetY = _clickedTranslateOriginal.OffsetY + vectMouse.Y; |
_clickedTranslate.OffsetX += scalex * vectMouse.X;// _clickedTranslateOriginal.OffsetX + vectMouse.X; |
| 327 |
_clickedTranslate.OffsetZ = _clickedTranslateOriginal.OffsetZ + vectMouse.Z;// vectMouse.Z; |
// _clickedTranslate.OffsetY += scaley * vectMouse.Y;// _clickedTranslateOriginal.OffsetY + vectMouse.Y; |
| 328 |
|
_clickedTranslate.OffsetZ += scaley * vectMouse.Z;// _clickedTranslateOriginal.OffsetZ + vectMouse.Z;// vectMouse.Z; |
| 329 |
|
|
| 330 |
|
|
| 331 |
|
mm += vectMouse.Y.ToString() + "/n"; |
| 332 |
|
|
| 333 |
} |
} |
| 334 |
|
|
| 335 |
|
|
| 336 |
|
|
| 337 |
private void LookUpDown(Point currentPosition) |
private void LookUpDown(Point currentPosition) |
| 338 |
{ |
{ |
| 339 |
double scale = currentPosition.Y- _previousPosition2D.Y; |
double scale = currentPosition.Y- _previousPosition2D.Y; |