CADViewComponent/dist/Orbit.js
2020-04-30 17:21:10 +08:00

86 lines
2.5 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var three_1 = require("three");
/**
* 轨道控制的数学类,观察向量和角度的互相转换
* 当x当抬头或者低头到90度时,触发万向锁.
*
* @class Orbit
*/
var Orbit = /** @class */ (function () {
function Orbit() {
//抬头低头 正数抬头 负数低头
this.m_RoX = 0;
//身体旋转 0为正右边 逆时针旋转
this.RoZ = 0;
}
Object.defineProperty(Orbit.prototype, "RoX", {
get: function () {
return this.m_RoX;
},
set: function (v) {
this.m_RoX = three_1.MathUtils.clamp(v, Math.PI * -0.5, Math.PI * 0.5);
},
enumerable: true,
configurable: true
});
/**
* 使用旋转角度 计算观察向量
*
* @param {Vector3} [dir] 引用传入,如果传入,那么就不构造新的向量
* @returns {Vector3} 返回观察向量
* @memberof Orbit
*/
Orbit.prototype.UpdateDirection = function (dir) {
var rtDir = dir ? dir : new three_1.Vector3();
rtDir.z = Math.sin(this.m_RoX);
//归一化专用.
var d = Math.abs(Math.cos(this.m_RoX));
rtDir.x = Math.cos(this.RoZ) * d;
rtDir.y = Math.sin(this.RoZ) * d;
return rtDir;
};
/**
* 使用观察向量,计算旋转角度
*
* @param {Vector3} dir
* @memberof Orbit
*/
Orbit.prototype.UpdateRoValue = function (dir) {
dir.normalize();
this.m_RoX = Math.asin(dir.z);
if (dir.x < 1e-4 && dir.y < 1e-4)
this.RoZ = Math.PI * 0.5;
else
this.RoZ = Math.atan2(dir.y, dir.x);
};
/**
*
* 根据观察向量 求头部的向量.
*
* @static
* @param {Vector3} dir
* @param {Vector3} [up]
* @returns {Vector3}
* @memberof Orbit
*/
Orbit.ComputUpDirection = function (dir, up) {
var upRes = up ? up : new three_1.Vector3();
if (dir.equals(new three_1.Vector3(0, 0, -1))) {
upRes.set(0, 1, 0);
}
else if (dir.equals(new three_1.Vector3(0, 0, 1))) {
upRes.set(0, -1, 0);
}
else {
var xv = new three_1.Vector3();
xv.crossVectors(new three_1.Vector3(0, 0, 1), dir);
upRes.crossVectors(dir, xv);
upRes.normalize();
}
return upRes;
};
return Orbit;
}());
exports.Orbit = Orbit;
//# sourceMappingURL=Orbit.js.map