"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