UNPKG

3.65 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.lookAt = lookAt;
7
8var _glVec = require('gl-vec3');
9
10var _glVec2 = _interopRequireDefault(_glVec);
11
12function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
14var kEpsilon = 0.000000001;
15
16// adapted from:
17// https://github.com/Jam3/perspective-camera/blob/master/lib/camera-look-at.js
18function lookAt(direction, target, position, up) {
19 var tmp = [];
20 _glVec2.default.subtract(tmp, target, position);
21 _glVec2.default.normalize(tmp, tmp);
22 if (tmp.every(Boolean)) {
23 // not zero vector
24 var d = _glVec2.default.dot(tmp, up);
25 if (Math.abs(d - 1) < kEpsilon) {
26 // collinear
27 _glVec2.default.scale(up, direction, -1);
28 } else if (Math.abs(d + 1) < kEpsilon) {
29 // collinear opposite
30 _glVec2.default.copy(up, direction);
31 }
32 _glVec2.default.copy(direction, tmp);
33 _glVec2.default.cross(tmp, direction, up);
34 _glVec2.default.normalize(tmp, tmp);
35 _glVec2.default.cross(up, tmp, direction);
36 _glVec2.default.normalize(up, up);
37 }
38}
39//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jYW1lcmEvbG9vay1hdC5qcyJdLCJuYW1lcyI6WyJsb29rQXQiLCJrRXBzaWxvbiIsImRpcmVjdGlvbiIsInRhcmdldCIsInBvc2l0aW9uIiwidXAiLCJ0bXAiLCJzdWJ0cmFjdCIsIm5vcm1hbGl6ZSIsImV2ZXJ5IiwiQm9vbGVhbiIsImQiLCJkb3QiLCJNYXRoIiwiYWJzIiwic2NhbGUiLCJjb3B5IiwiY3Jvc3MiXSwibWFwcGluZ3MiOiI7Ozs7O1FBTWdCQSxNLEdBQUFBLE07O0FBTmhCOzs7Ozs7QUFFQSxJQUFNQyxXQUFXLFdBQWpCOztBQUVBO0FBQ0E7QUFDTyxTQUFTRCxNQUFULENBQWdCRSxTQUFoQixFQUEyQkMsTUFBM0IsRUFBbUNDLFFBQW5DLEVBQTZDQyxFQUE3QyxFQUFpRDtBQUN0RCxNQUFNQyxNQUFNLEVBQVo7QUFDQSxrQkFBS0MsUUFBTCxDQUFjRCxHQUFkLEVBQW1CSCxNQUFuQixFQUEyQkMsUUFBM0I7QUFDQSxrQkFBS0ksU0FBTCxDQUFlRixHQUFmLEVBQW9CQSxHQUFwQjtBQUNBLE1BQUlBLElBQUlHLEtBQUosQ0FBVUMsT0FBVixDQUFKLEVBQXdCO0FBQUU7QUFDeEIsUUFBTUMsSUFBSSxnQkFBS0MsR0FBTCxDQUFTTixHQUFULEVBQWNELEVBQWQsQ0FBVjtBQUNBLFFBQUlRLEtBQUtDLEdBQUwsQ0FBU0gsSUFBSSxDQUFiLElBQWtCVixRQUF0QixFQUFnQztBQUFFO0FBQ2hDLHNCQUFLYyxLQUFMLENBQVdWLEVBQVgsRUFBZUgsU0FBZixFQUEwQixDQUFDLENBQTNCO0FBQ0QsS0FGRCxNQUVPLElBQUlXLEtBQUtDLEdBQUwsQ0FBU0gsSUFBSSxDQUFiLElBQWtCVixRQUF0QixFQUFnQztBQUFFO0FBQ3ZDLHNCQUFLZSxJQUFMLENBQVVYLEVBQVYsRUFBY0gsU0FBZDtBQUNEO0FBQ0Qsb0JBQUtjLElBQUwsQ0FBVWQsU0FBVixFQUFxQkksR0FBckI7QUFDQSxvQkFBS1csS0FBTCxDQUFXWCxHQUFYLEVBQWdCSixTQUFoQixFQUEyQkcsRUFBM0I7QUFDQSxvQkFBS0csU0FBTCxDQUFlRixHQUFmLEVBQW9CQSxHQUFwQjtBQUNBLG9CQUFLVyxLQUFMLENBQVdaLEVBQVgsRUFBZUMsR0FBZixFQUFvQkosU0FBcEI7QUFDQSxvQkFBS00sU0FBTCxDQUFlSCxFQUFmLEVBQW1CQSxFQUFuQjtBQUNEO0FBQ0YiLCJmaWxlIjoibG9vay1hdC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB2ZWMzIGZyb20gJ2dsLXZlYzMnXG5cbmNvbnN0IGtFcHNpbG9uID0gMC4wMDAwMDAwMDFcblxuLy8gYWRhcHRlZCBmcm9tOlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL0phbTMvcGVyc3BlY3RpdmUtY2FtZXJhL2Jsb2IvbWFzdGVyL2xpYi9jYW1lcmEtbG9vay1hdC5qc1xuZXhwb3J0IGZ1bmN0aW9uIGxvb2tBdChkaXJlY3Rpb24sIHRhcmdldCwgcG9zaXRpb24sIHVwKSB7XG4gIGNvbnN0IHRtcCA9IFtdXG4gIHZlYzMuc3VidHJhY3QodG1wLCB0YXJnZXQsIHBvc2l0aW9uKVxuICB2ZWMzLm5vcm1hbGl6ZSh0bXAsIHRtcClcbiAgaWYgKHRtcC5ldmVyeShCb29sZWFuKSkgeyAvLyBub3QgemVybyB2ZWN0b3JcbiAgICBjb25zdCBkID0gdmVjMy5kb3QodG1wLCB1cClcbiAgICBpZiAoTWF0aC5hYnMoZCAtIDEpIDwga0Vwc2lsb24pIHsgLy8gY29sbGluZWFyXG4gICAgICB2ZWMzLnNjYWxlKHVwLCBkaXJlY3Rpb24sIC0xKVxuICAgIH0gZWxzZSBpZiAoTWF0aC5hYnMoZCArIDEpIDwga0Vwc2lsb24pIHsgLy8gY29sbGluZWFyIG9wcG9zaXRlXG4gICAgICB2ZWMzLmNvcHkodXAsIGRpcmVjdGlvbilcbiAgICB9XG4gICAgdmVjMy5jb3B5KGRpcmVjdGlvbiwgdG1wKVxuICAgIHZlYzMuY3Jvc3ModG1wLCBkaXJlY3Rpb24sIHVwKVxuICAgIHZlYzMubm9ybWFsaXplKHRtcCwgdG1wKVxuICAgIHZlYzMuY3Jvc3ModXAsIHRtcCwgZGlyZWN0aW9uKVxuICAgIHZlYzMubm9ybWFsaXplKHVwLCB1cClcbiAgfVxufVxuIl19
\No newline at end of file