本文整理汇总了TypeScript中babylonjs/Maths/math.Quaternion类的典型用法代码示例。如果您正苦于以下问题:TypeScript Quaternion类的具体用法?TypeScript Quaternion怎么用?TypeScript Quaternion使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了Quaternion类的6个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的TypeScript代码示例。
示例1: _GetBasePositionRotationOrScale
private static _GetBasePositionRotationOrScale(babylonTransformNode: TransformNode, animationChannelTargetPath: AnimationChannelTargetPath, convertToRightHandedSystem: boolean, useQuaternion: boolean) {
let basePositionRotationOrScale: number[];
if (animationChannelTargetPath === AnimationChannelTargetPath.ROTATION) {
if (useQuaternion) {
if (babylonTransformNode.rotationQuaternion) {
basePositionRotationOrScale = babylonTransformNode.rotationQuaternion.asArray();
if (convertToRightHandedSystem) {
_GLTFUtilities._GetRightHandedQuaternionArrayFromRef(basePositionRotationOrScale);
if (!babylonTransformNode.parent) {
basePositionRotationOrScale = Quaternion.FromArray([0, 1, 0, 0]).multiply(Quaternion.FromArray(basePositionRotationOrScale)).asArray();
}
}
}
else {
basePositionRotationOrScale = Quaternion.Identity().asArray();
}
}
else {
basePositionRotationOrScale = babylonTransformNode.rotation.asArray();
_GLTFUtilities._GetRightHandedNormalArray3FromRef(basePositionRotationOrScale);
}
}
else if (animationChannelTargetPath === AnimationChannelTargetPath.TRANSLATION) {
basePositionRotationOrScale = babylonTransformNode.position.asArray();
if (convertToRightHandedSystem) {
_GLTFUtilities._GetRightHandedPositionArray3FromRef(basePositionRotationOrScale);
}
}
else { // scale
basePositionRotationOrScale = babylonTransformNode.scaling.asArray();
}
return basePositionRotationOrScale;
}
示例2: _ConvertFactorToVector3OrQuaternion
private static _ConvertFactorToVector3OrQuaternion(factor: number, babylonTransformNode: TransformNode, animation: Animation, animationType: number, animationChannelTargetPath: AnimationChannelTargetPath, convertToRightHandedSystem: boolean, useQuaternion: boolean): Nullable<Vector3 | Quaternion> {
let property: string[];
let componentName: string;
let value: Nullable<Quaternion | Vector3> = null;
const basePositionRotationOrScale = _GLTFAnimation._GetBasePositionRotationOrScale(babylonTransformNode, animationChannelTargetPath, convertToRightHandedSystem, useQuaternion);
if (animationType === Animation.ANIMATIONTYPE_FLOAT) { // handles single component x, y, z or w component animation by using a base property and animating over a component.
property = animation.targetProperty.split('.');
componentName = property ? property[1] : ''; // x, y, or z component
value = useQuaternion ? Quaternion.FromArray(basePositionRotationOrScale).normalize() : Vector3.FromArray(basePositionRotationOrScale);
switch (componentName) {
case 'x': {
value[componentName] = (convertToRightHandedSystem && useQuaternion && (animationChannelTargetPath !== AnimationChannelTargetPath.SCALE)) ? -factor : factor;
break;
}
case 'y': {
value[componentName] = (convertToRightHandedSystem && useQuaternion && (animationChannelTargetPath !== AnimationChannelTargetPath.SCALE)) ? -factor : factor;
break;
}
case 'z': {
value[componentName] = (convertToRightHandedSystem && !useQuaternion && (animationChannelTargetPath !== AnimationChannelTargetPath.SCALE)) ? -factor : factor;
break;
}
case 'w': {
(value as Quaternion).w = factor;
break;
}
default: {
Tools.Error(`glTFAnimation: Unsupported component type "${componentName}" for scale animation!`);
}
}
}
return value;
}
示例3: _CreateBakedAnimation
/**
* Create a baked animation
* @param babylonTransformNode BabylonJS mesh
* @param animation BabylonJS animation corresponding to the BabylonJS mesh
* @param animationChannelTargetPath animation target channel
* @param minFrame minimum animation frame
* @param maxFrame maximum animation frame
* @param fps frames per second of the animation
* @param inputs input key frames of the animation
* @param outputs output key frame data of the animation
* @param convertToRightHandedSystem converts the values to right-handed
* @param useQuaternion specifies if quaternions should be used
*/
private static _CreateBakedAnimation(babylonTransformNode: TransformNode, animation: Animation, animationChannelTargetPath: AnimationChannelTargetPath, minFrame: number, maxFrame: number, fps: number, sampleRate: number, inputs: number[], outputs: number[][], minMaxFrames: { min: number, max: number }, convertToRightHandedSystem: boolean, useQuaternion: boolean) {
let value: number | Vector3 | Quaternion;
let quaternionCache: Quaternion = Quaternion.Identity();
let previousTime: Nullable<number> = null;
let time: number;
let maxUsedFrame: Nullable<number> = null;
let currKeyFrame: Nullable<IAnimationKey> = null;
let nextKeyFrame: Nullable<IAnimationKey> = null;
let prevKeyFrame: Nullable<IAnimationKey> = null;
let endFrame: Nullable<number> = null;
minMaxFrames.min = Tools.FloatRound(minFrame / fps);
let keyFrames = animation.getKeys();
for (let i = 0, length = keyFrames.length; i < length; ++i) {
endFrame = null;
currKeyFrame = keyFrames[i];
if (i + 1 < length) {
nextKeyFrame = keyFrames[i + 1];
if (currKeyFrame.value.equals(nextKeyFrame.value)) {
if (i === 0) { // set the first frame to itself
endFrame = currKeyFrame.frame;
}
else {
continue;
}
}
else {
endFrame = nextKeyFrame.frame;
}
}
else {
// at the last key frame
prevKeyFrame = keyFrames[i - 1];
if (currKeyFrame.value.equals(prevKeyFrame.value)) {
continue;
}
else {
endFrame = maxFrame;
}
}
if (endFrame) {
for (let f = currKeyFrame.frame; f <= endFrame; f += sampleRate) {
time = Tools.FloatRound(f / fps);
if (time === previousTime) {
continue;
}
previousTime = time;
maxUsedFrame = time;
value = animation._interpolate(f, 0, undefined, animation.loopMode);
_GLTFAnimation._SetInterpolatedValue(babylonTransformNode, value, time, animation, animationChannelTargetPath, quaternionCache, inputs, outputs, convertToRightHandedSystem, useQuaternion);
}
}
}
if (maxUsedFrame) {
minMaxFrames.max = maxUsedFrame;
}
}
示例4: AddSplineTangent
/**
* Adds an input tangent or output tangent to the output data
* If an input tangent or output tangent is missing, it uses the zero vector or zero quaternion
* @param tangentType Specifies which type of tangent to handle (inTangent or outTangent)
* @param outputs The animation data by keyframe
* @param animationChannelTargetPath The target animation channel
* @param interpolation The interpolation type
* @param keyFrame The key frame with the animation data
* @param frameDelta Time difference between two frames used to scale the tangent by the frame delta
* @param useQuaternion Specifies if quaternions are used
* @param convertToRightHandedSystem Specifies if the values should be converted to right-handed
*/
private static AddSplineTangent(babylonTransformNode: TransformNode, tangentType: _TangentType, outputs: number[][], animationChannelTargetPath: AnimationChannelTargetPath, interpolation: AnimationSamplerInterpolation, keyFrame: IAnimationKey, frameDelta: number, useQuaternion: boolean, convertToRightHandedSystem: boolean) {
let tangent: number[];
let tangentValue: Vector3 | Quaternion = tangentType === _TangentType.INTANGENT ? keyFrame.inTangent : keyFrame.outTangent;
if (interpolation === AnimationSamplerInterpolation.CUBICSPLINE) {
if (animationChannelTargetPath === AnimationChannelTargetPath.ROTATION) {
if (tangentValue) {
if (useQuaternion) {
tangent = (tangentValue as Quaternion).scale(frameDelta).asArray();
}
else {
const array = (tangentValue as Vector3).scale(frameDelta);
tangent = Quaternion.RotationYawPitchRoll(array.y, array.x, array.z).asArray();
}
if (convertToRightHandedSystem) {
_GLTFUtilities._GetRightHandedQuaternionArrayFromRef(tangent);
if (!babylonTransformNode.parent) {
tangent = Quaternion.FromArray([0, 1, 0, 0]).multiply(Quaternion.FromArray(tangent)).asArray();
}
}
}
else {
tangent = [0, 0, 0, 0];
}
}
else {
if (tangentValue) {
tangent = (tangentValue as Vector3).scale(frameDelta).asArray();
if (convertToRightHandedSystem) {
if (animationChannelTargetPath === AnimationChannelTargetPath.TRANSLATION) {
_GLTFUtilities._GetRightHandedPositionArray3FromRef(tangent);
if (!babylonTransformNode.parent) {
tangent[0] *= -1; // x
tangent[2] *= -1; // z
}
}
}
}
else {
tangent = [0, 0, 0];
}
}
outputs.push(tangent);
}
}
示例5: _SetInterpolatedValue
private static _SetInterpolatedValue(babylonTransformNode: TransformNode, value: Nullable<number | Vector3 | Quaternion>, time: number, animation: Animation, animationChannelTargetPath: AnimationChannelTargetPath, quaternionCache: Quaternion, inputs: number[], outputs: number[][], convertToRightHandedSystem: boolean, useQuaternion: boolean) {
const animationType = animation.dataType;
let cacheValue: Vector3 | Quaternion;
inputs.push(time);
if (typeof value === "number") {
value = this._ConvertFactorToVector3OrQuaternion(value as number, babylonTransformNode, animation, animationType, animationChannelTargetPath, convertToRightHandedSystem, useQuaternion);
}
if (value) {
if (animationChannelTargetPath === AnimationChannelTargetPath.ROTATION) {
if (useQuaternion) {
quaternionCache = value as Quaternion;
}
else {
cacheValue = value as Vector3;
Quaternion.RotationYawPitchRollToRef(cacheValue.y, cacheValue.x, cacheValue.z, quaternionCache);
}
if (convertToRightHandedSystem) {
_GLTFUtilities._GetRightHandedQuaternionFromRef(quaternionCache);
if (!babylonTransformNode.parent) {
quaternionCache = Quaternion.FromArray([0, 1, 0, 0]).multiply(quaternionCache);
}
}
outputs.push(quaternionCache.asArray());
}
else {
cacheValue = value as Vector3;
if (convertToRightHandedSystem && (animationChannelTargetPath !== AnimationChannelTargetPath.SCALE)) {
_GLTFUtilities._GetRightHandedPositionVector3FromRef(cacheValue);
if (!babylonTransformNode.parent) {
cacheValue.x *= -1;
cacheValue.z *= -1;
}
}
outputs.push(cacheValue.asArray());
}
}
}
示例6: _AddKeyframeValue
/**
* Adds a key frame value
* @param keyFrame
* @param animation
* @param outputs
* @param animationChannelTargetPath
* @param basePositionRotationOrScale
* @param convertToRightHandedSystem
* @param useQuaternion
*/
private static _AddKeyframeValue(keyFrame: IAnimationKey, animation: Animation, outputs: number[][], animationChannelTargetPath: AnimationChannelTargetPath, babylonTransformNode: TransformNode, convertToRightHandedSystem: boolean, useQuaternion: boolean) {
let value: number[];
let newPositionRotationOrScale: Nullable<Vector3 | Quaternion>;
const animationType = animation.dataType;
if (animationType === Animation.ANIMATIONTYPE_VECTOR3) {
value = keyFrame.value.asArray();
if (animationChannelTargetPath === AnimationChannelTargetPath.ROTATION) {
const array = Vector3.FromArray(value);
let rotationQuaternion = Quaternion.RotationYawPitchRoll(array.y, array.x, array.z);
if (convertToRightHandedSystem) {
_GLTFUtilities._GetRightHandedQuaternionFromRef(rotationQuaternion);
if (!babylonTransformNode.parent) {
rotationQuaternion = Quaternion.FromArray([0, 1, 0, 0]).multiply(rotationQuaternion);
}
}
value = rotationQuaternion.asArray();
}
else if (animationChannelTargetPath === AnimationChannelTargetPath.TRANSLATION) {
if (convertToRightHandedSystem) {
_GLTFUtilities._GetRightHandedNormalArray3FromRef(value);
if (!babylonTransformNode.parent) {
value[0] *= -1;
value[2] *= -1;
}
}
}
outputs.push(value); // scale vector.
}
else if (animationType === Animation.ANIMATIONTYPE_FLOAT) { // handles single component x, y, z or w component animation by using a base property and animating over a component.
newPositionRotationOrScale = this._ConvertFactorToVector3OrQuaternion(keyFrame.value as number, babylonTransformNode, animation, animationType, animationChannelTargetPath, convertToRightHandedSystem, useQuaternion);
if (newPositionRotationOrScale) {
if (animationChannelTargetPath === AnimationChannelTargetPath.ROTATION) {
let posRotScale = useQuaternion ? newPositionRotationOrScale as Quaternion : Quaternion.RotationYawPitchRoll(newPositionRotationOrScale.y, newPositionRotationOrScale.x, newPositionRotationOrScale.z).normalize();
if (convertToRightHandedSystem) {
_GLTFUtilities._GetRightHandedQuaternionFromRef(posRotScale);
if (!babylonTransformNode.parent) {
posRotScale = Quaternion.FromArray([0, 1, 0, 0]).multiply(posRotScale);
}
}
outputs.push(posRotScale.asArray());
}
else if (animationChannelTargetPath === AnimationChannelTargetPath.TRANSLATION) {
if (convertToRightHandedSystem) {
_GLTFUtilities._GetRightHandedNormalVector3FromRef(newPositionRotationOrScale as Vector3);
if (!babylonTransformNode.parent) {
newPositionRotationOrScale.x *= -1;
newPositionRotationOrScale.z *= -1;
}
}
}
outputs.push(newPositionRotationOrScale.asArray());
}
}
else if (animationType === Animation.ANIMATIONTYPE_QUATERNION) {
value = (keyFrame.value as Quaternion).normalize().asArray();
if (convertToRightHandedSystem) {
_GLTFUtilities._GetRightHandedQuaternionArrayFromRef(value);
if (!babylonTransformNode.parent) {
value = Quaternion.FromArray([0, 1, 0, 0]).multiply(Quaternion.FromArray(value)).asArray();
}
}
outputs.push(value);
}
else {
Tools.Error('glTFAnimation: Unsupported key frame values for animation!');
}
}