playcanvas
Version:
PlayCanvas WebGL game engine
224 lines (223 loc) • 5.6 kB
TypeScript
/**
* The RotateGizmo provides interactive 3D manipulation handles for rotating/reorienting
* {@link Entity}s in a {@link Scene}. It creates a visual widget with a draggable ring for each
* axis of rotation, plus a fourth ring for rotation in the camera's view plane, allowing precise
* control over object orientation through direct manipulation. The gizmo's visual appearance can
* be customized away from the defaults as required.
*
* Note that the gizmo can be driven by both mouse+keyboard and touch input.
*
* ```javascript
* // Create a layer for rendering all gizmos
* const gizmoLayer = pc.Gizmo.createLayer(app);
*
* // Create a rotate gizmo
* const gizmo = new pc.RotateGizmo(cameraComponent, gizmoLayer);
*
* // Create an entity to attach the gizmo to
* const entity = new pc.Entity();
* entity.addComponent('render', {
* type: 'box'
* });
* app.root.addChild(entity);
*
* // Attach the gizmo to the entity
* gizmo.attach([entity]);
* ```
*
* Relevant Engine API examples:
*
* - [Rotate Gizmo](https://playcanvas.github.io/#/gizmos/transform-rotate)
* - [Editor](https://playcanvas.github.io/#/misc/editor)
*
* @category Gizmo
*/
export class RotateGizmo extends TransformGizmo {
_shapes: {
z: ArcShape;
x: ArcShape;
y: ArcShape;
face: ArcShape;
};
/**
* Internal selection starting angle in world space.
*
* @type {number}
* @private
*/
private _selectionStartAngle;
/**
* Internal mapping from each attached node to their starting rotation in local space.
*
* @type {Map<GraphNode, Quat>}
* @private
*/
private _nodeLocalRotations;
/**
* Internal mapping from each attached node to their starting rotation in world space.
*
* @type {Map<GraphNode, Quat>}
* @private
*/
private _nodeRotations;
/**
* Internal mapping from each attached node to their offset position from the gizmo.
*
* @type {Map<GraphNode, Vec3>}
* @private
*/
private _nodeOffsets;
/**
* Internal color for guide angle starting line.
*
* @type {Color}
* @private
*/
private _guideAngleStartColor;
/**
* Internal vector for the start point of the guide line angle.
*
* @type {Vec3}
* @private
*/
private _guideAngleStart;
/**
* Internal vector for the end point of the guide line angle.
*
* @type {Vec3}
* @private
*/
private _guideAngleEnd;
/**
* This forces the rotation to always be calculated based on the mouse position around the gizmo.
*
* @type {boolean}
*/
orbitRotation: boolean;
/**
* Sets the XYZ tube radius.
*
* @type {number}
*/
set xyzTubeRadius(value: number);
/**
* Gets the XYZ tube radius.
*
* @type {number}
*/
get xyzTubeRadius(): number;
/**
* Sets the XYZ ring radius.
*
* @type {number}
*/
set xyzRingRadius(value: number);
/**
* Gets the XYZ ring radius.
*
* @type {number}
*/
get xyzRingRadius(): number;
/**
* Sets the face tube radius.
*
* @type {number}
*/
set faceTubeRadius(value: number);
/**
* Gets the face tube radius.
*
* @type {number}
*/
get faceTubeRadius(): number;
/**
* Sets the face ring radius.
*
* @type {number}
*/
set faceRingRadius(value: number);
/**
* Gets the face ring radius.
*
* @type {number}
*/
get faceRingRadius(): number;
/**
* Sets the ring tolerance.
*
* @type {number}
*/
set ringTolerance(value: number);
/**
* Gets the ring tolerance.
*
* @type {number}
*/
get ringTolerance(): number;
/**
* @param {string} prop - The property.
* @param {any} value - The value.
* @private
*/
private _setDiskProp;
/**
* @private
*/
private _storeGuidePoints;
/**
* @param {number} angleDelta - The angle delta.
* @private
*/
private _updateGuidePoints;
/**
* @param {Vec3} pos - The position.
* @param {string} axis - The axis.
* @param {Vec3} point - The point.
* @param {Color} [color] - The color.
* @private
*/
private _drawGuideAngleLine;
/**
* @param {Vec3} position - The position.
* @returns {Vec3} The look at euler angles.
* @private
*/
private _getLookAtEulerAngles;
/**
* @private
*/
private _shapesLookAtCamera;
/**
* @param {boolean} state - The state.
* @private
*/
private _drag;
/**
* @private
*/
private _storeNodeRotations;
/**
* @param {string} axis - The axis.
* @param {number} angleDelta - The angle delta.
* @private
*/
private _setNodeRotations;
/**
* @param {number} x - The x coordinate.
* @param {number} y - The y coordinate.
* @returns {Vec3} The point in world space.
* @protected
*/
protected _screenToPoint(x: number, y: number): Vec3;
/**
* @param {Vec3} point - The point.
* @param {number} x - The x coordinate.
* @param {number} y - The y coordinate.
* @returns {number} The angle.
* @protected
*/
protected _calculateAngle(point: Vec3, x: number, y: number): number;
}
import { TransformGizmo } from './transform-gizmo.js';
import { ArcShape } from './shape/arc-shape.js';
import { Vec3 } from '../../core/math/vec3.js';