add SkinViewer.zoom property, close #102
This commit is contained in:
parent
4c066091b0
commit
b16194be6a
|
@ -53,6 +53,9 @@ Three.js powered Minecraft skin viewer.
|
||||||
// Change camera FOV
|
// Change camera FOV
|
||||||
skinViewer.fov = 70;
|
skinViewer.fov = 70;
|
||||||
|
|
||||||
|
// Zoom out
|
||||||
|
skinViewer.zoom = 0.5;
|
||||||
|
|
||||||
// Control objects with your mouse!
|
// Control objects with your mouse!
|
||||||
let control = skinview3d.createOrbitControls(skinViewer);
|
let control = skinview3d.createOrbitControls(skinViewer);
|
||||||
control.enableRotate = true;
|
control.enableRotate = true;
|
||||||
|
|
|
@ -118,6 +118,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label class="control">FOV: <input id="fov" type="number" value="70" step="1" min="1" max="179" size="2"></label>
|
<label class="control">FOV: <input id="fov" type="number" value="70" step="1" min="1" max="179" size="2"></label>
|
||||||
|
<label class="control">Zoom: <input id="zoom" type="number" value="0.90" step="0.01" min="0.01" max="2.00" size="2"></label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -367,6 +368,7 @@
|
||||||
document.getElementById("canvas_width").addEventListener("change", e => skinViewer.width = e.target.value);
|
document.getElementById("canvas_width").addEventListener("change", e => skinViewer.width = e.target.value);
|
||||||
document.getElementById("canvas_height").addEventListener("change", e => skinViewer.height = e.target.value);
|
document.getElementById("canvas_height").addEventListener("change", e => skinViewer.height = e.target.value);
|
||||||
document.getElementById("fov").addEventListener("change", e => skinViewer.fov = e.target.value);
|
document.getElementById("fov").addEventListener("change", e => skinViewer.fov = e.target.value);
|
||||||
|
document.getElementById("zoom").addEventListener("change", e => skinViewer.zoom = e.target.value);
|
||||||
document.getElementById("global_animation_speed").addEventListener("change", e => skinViewer.animations.speed = e.target.value);
|
document.getElementById("global_animation_speed").addEventListener("change", e => skinViewer.animations.speed = e.target.value);
|
||||||
document.getElementById("animation_pause_resume").addEventListener("click", () => skinViewer.animations.paused = !skinViewer.animations.paused);
|
document.getElementById("animation_pause_resume").addEventListener("click", () => skinViewer.animations.paused = !skinViewer.animations.paused);
|
||||||
document.getElementById("rotate_animation").addEventListener("change", e => {
|
document.getElementById("rotate_animation").addEventListener("change", e => {
|
||||||
|
@ -466,6 +468,7 @@
|
||||||
skinViewer.width = document.getElementById("canvas_width").value;
|
skinViewer.width = document.getElementById("canvas_width").value;
|
||||||
skinViewer.height = document.getElementById("canvas_height").value;
|
skinViewer.height = document.getElementById("canvas_height").value;
|
||||||
skinViewer.fov = document.getElementById("fov").value;
|
skinViewer.fov = document.getElementById("fov").value;
|
||||||
|
skinViewer.zoom = document.getElementById("zoom").value;
|
||||||
skinViewer.animations.speed = document.getElementById("global_animation_speed").value;
|
skinViewer.animations.speed = document.getElementById("global_animation_speed").value;
|
||||||
if (document.getElementById("rotate_animation").checked) {
|
if (document.getElementById("rotate_animation").checked) {
|
||||||
rotateAnimation = skinViewer.animations.add(skinview3d.RotatingAnimation);
|
rotateAnimation = skinViewer.animations.add(skinview3d.RotatingAnimation);
|
||||||
|
|
|
@ -63,6 +63,13 @@ export interface SkinViewerOptions {
|
||||||
* The distance between the object and the camera is automatically computed.
|
* The distance between the object and the camera is automatically computed.
|
||||||
*/
|
*/
|
||||||
fov?: number;
|
fov?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Zoom ratio of the player. Default is 0.9.
|
||||||
|
* This value affects the distance between the object and the camera.
|
||||||
|
* When set to 1.0, the top edge of the player's head coincides with the edge of the view.
|
||||||
|
*/
|
||||||
|
zoom?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class SkinViewer {
|
export class SkinViewer {
|
||||||
|
@ -82,6 +89,7 @@ export class SkinViewer {
|
||||||
|
|
||||||
private _disposed: boolean = false;
|
private _disposed: boolean = false;
|
||||||
private _renderPaused: boolean = false;
|
private _renderPaused: boolean = false;
|
||||||
|
private _zoom: number;
|
||||||
|
|
||||||
private animationID: number | null;
|
private animationID: number | null;
|
||||||
private onContextLost: (event: Event) => void;
|
private onContextLost: (event: Event) => void;
|
||||||
|
@ -104,7 +112,6 @@ export class SkinViewer {
|
||||||
this.scene = new Scene();
|
this.scene = new Scene();
|
||||||
|
|
||||||
this.camera = new PerspectiveCamera();
|
this.camera = new PerspectiveCamera();
|
||||||
this.camera.position.z = 60;
|
|
||||||
|
|
||||||
this.renderer = new WebGLRenderer({
|
this.renderer = new WebGLRenderer({
|
||||||
canvas: this.canvas,
|
canvas: this.canvas,
|
||||||
|
@ -140,6 +147,8 @@ export class SkinViewer {
|
||||||
if (options.panorama !== undefined) {
|
if (options.panorama !== undefined) {
|
||||||
this.loadPanorama(options.panorama);
|
this.loadPanorama(options.panorama);
|
||||||
}
|
}
|
||||||
|
this.camera.position.z = 1;
|
||||||
|
this._zoom = options.zoom === undefined ? 0.9 : options.zoom;
|
||||||
this.fov = options.fov === undefined ? 50 : options.fov;
|
this.fov = options.fov === undefined ? 50 : options.fov;
|
||||||
|
|
||||||
if (options.renderPaused === true) {
|
if (options.renderPaused === true) {
|
||||||
|
@ -342,17 +351,35 @@ export class SkinViewer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
adjustCameraDistance(): void {
|
||||||
|
let distance = 4.5 + 16.5 / Math.tan(this.fov / 180 * Math.PI / 2) / this.zoom;
|
||||||
|
|
||||||
|
// limit distance between 10 ~ 256 (default min / max distance of OrbitControls)
|
||||||
|
if (distance < 10) {
|
||||||
|
distance = 10;
|
||||||
|
} else if (distance > 256) {
|
||||||
|
distance = 256;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.camera.position.multiplyScalar(distance / this.camera.position.length());
|
||||||
|
this.camera.updateProjectionMatrix();
|
||||||
|
}
|
||||||
|
|
||||||
get fov(): number {
|
get fov(): number {
|
||||||
return this.camera.fov;
|
return this.camera.fov;
|
||||||
}
|
}
|
||||||
|
|
||||||
set fov(value: number) {
|
set fov(value: number) {
|
||||||
this.camera.fov = value;
|
this.camera.fov = value;
|
||||||
let distance = 4 + 20 / Math.tan(value / 180 * Math.PI / 2);
|
this.adjustCameraDistance();
|
||||||
if (distance < 10) {
|
}
|
||||||
distance = 10;
|
|
||||||
}
|
get zoom(): number {
|
||||||
this.camera.position.multiplyScalar(distance / this.camera.position.length());
|
return this._zoom;
|
||||||
this.camera.updateProjectionMatrix();
|
}
|
||||||
|
|
||||||
|
set zoom(value: number) {
|
||||||
|
this._zoom = value;
|
||||||
|
this.adjustCameraDistance();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue