threejs实现一个三维太阳系行星围绕太阳公转自转效果代码
代码语言:html
所属分类:三维
代码描述:threejs实现一个三维太阳系行星围绕太阳公转自转效果代码
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/three.61.js"></script>
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/jquery.17.js"></script>
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/jquery.mousewheel.js"></script>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
body{background:url(//repo.bfw.wiki/bfwrepo/image/607e4ca28879b.png) no-repeat;background-size:cover}
</style>
</head>
<body>
<!-- partial:index.partial.html -->
<div id="fiddleHook"></div>
<!-- partial -->
<script>
(function(app) {
"use strict";
let metadata = {
urls: {
github: '',
sun: {
surfaceMaterial: '//repo.bfw.wiki/bfwrepo/images/universer/sunSurfaceMaterial.jpg',
atmosphereMaterial: '//repo.bfw.wiki/bfwrepo/images/universer/sunAtmosphereMaterial.png'
},
mercury: {
surfaceMaterial: '//repo.bfw.wiki/bfwrepo/images/universer/mercurySurfaceMaterial.jpg'
},
venus: {
surfaceMaterial: '//repo.bfw.wiki/bfwrepo/image/5ec0779dc7b4d.png'
},
earth: {
normalMaterial: '//repo.bfw.wiki/bfwrepo/images/universer/earthSurfaceNormal.jpg',
surfaceMaterial: '//repo.bfw.wiki/bfwrepo/images/universer/earthSurface.jpg',
specularMaterial: '//repo.bfw.wiki/bfwrepo/images/universer/earthSurfaceSpecular.jpg',
cloudsMaterial: '//repo.bfw.wiki/bfwrepo/images/universer/earthAtmosphere.png'
},
moon: '//repo.bfw.wiki/bfwrepo/images/universer/moon.jpg',
mars: {
surfaceMaterial: '//repo.bfw.wiki/bfwrepo/images/universer/marsSurfaceMaterial.png'
},
jupiter: {
surfaceMaterial: '//repo.bfw.wiki/bfwrepo/images/universer/jupiterSurfaceMaterial.jpg'
},
saturn: {
surfaceMaterial: '//repo.bfw.wiki/bfwrepo/images/universer/saturnSurface.jpg',
ringsMaterial: '//repo.bfw.wiki/bfwrepo/images/universer/saturnRings.png'
},
uranus: {
surfaceMaterial: '//repo.bfw.wiki/bfwrepo/images/universer/uranusSurfaceMaterial.jpg'
},
neptune: {
surfaceMaterial: '//repo.bfw.wiki/bfwrepo/images/universer/neptuneSurfaceMaterial.jpg'
},
pluto: {
surfaceMaterial: '//repo.bfw.wiki/bfwrepo/images/universer/plutoSurfaceMaterial.jpg'
},
},
consoleTag: 'H O U S E ~ f i d d l e s',
constants: {
SUN_SIZE_IN_EARTHS: 20,
MOUSE_MOVE_TOLERANCE: 4,
MAX_ROTATION_X: Math.PI / 2,
MAX_CAMERA_Z: 10 * 50,
MIN_CAMERA_Z: 10 * 3,
EARTH_DISTANCE: 50,
PLUTO_DISTANCE_IN_EARTHS: 77.2,
EARTH_DISTANCE_SQUARED: 45000,
EXAGGERATED_PLANET_SCALE: 5.55,
MOON_DISTANCE_FROM_EARTH: 356400,
MOON_PERIOD: 28,
MOON_ROTATION_SPEED: 0.003,
MOON_EXAGGERATE_FACTOR: 1.2,
MOON_SIZE_IN_EARTHS: 1 / 3.7 * 1.2
}
};
app.toolkit = app.toolkit || {};
app.toolkit.three = app.toolkit.three || {};
app.view = app.view || {};
app.view.milkyway = app.view.milkyway || {};
app.view.milkyway.saturn = app.view.milkyway.saturn || {};
app.view.milkyway.earth = app.view.milkyway.earth || {};
app.toolkit.three.Publisher = class {
constructor() {
this._messageTypes = {};
}
get messageTypes() {
return this._messageTypes;
}
subscribe(message, subscriber, callback) {
var subscribers = this.messageTypes[message];
if (subscribers) {
if (this.findSubscriber(subscribers, subscriber) != -1) {
return;
}
} else {
subscribers = [];
this.messageTypes[message] = subscribers;
}
subscribers.push({
subscriber: subscriber,
callback: callback
});
}
unsubscribe(message, subscriber, callback) {
if (subscriber) {
var subscribers = this.messageTypes[message];
if (subscribers) {
var i = this.findSubscriber(subscribers, subscriber, callback);
if (i != -1) {
this.messageTypes[message].splice(i, 1);
}
}
} else {
delete this.messageTypes[message];
}
}
publish(message) {
var subscribers = this.messageTypes[message];
if (subscribers) {
for (var i = 0; i < subscribers.length; i++) {
var args = [];
for (var j = 0; j < arguments.length - 1; j++) {
args.push(arguments[j + 1]);
}
subscribers[i].callback.apply(subscribers[i].subscriber, args);
}
}
}
findSubscriber(subscribers, subscriber) {
for (var i = 0; i < subscribers.length; i++) {
if (subscribers[i] == subscriber) {
return i;
}
}
return -1;
}
}
app.toolkit.three.R = class extends app.toolkit.three.Publisher {
config() {
return {
keyUp: null,
keyDown: null,
keyPress: null,
mouseMove: null,
mouseDown: null,
mouseUp: null,
mouseScroll: null
}
}
constructor(config) {
super(config);
this._objects = [];
this._handleKeyUp = config && config.hasOwnProperty('keyUp') ? config.keyUp : this.config().keyUp;
this._handleKeyDown = config && config.hasOwnProperty('keyDown') ? config.keyDown : this.config().keyDown;
this._handleKeyPress = config && config.hasOwnProperty('keyPress') ? config.keyPress : this.config().keyPress;
this._handleMouseMove = config && config.hasOwnProperty('mouseMove') ? config.mouseMove : this.config().mouseMove;
this._handleMouseDown = config && config.hasOwnProperty('mouseDown') ? config.mouseDown : this.config().mouseDown;
this._handleMouseUp = config && config.hasOwnProperty('mouseUp') ? config.mouseUp : this.config().mouseUp;
this._handleMouseScroll = config && config.hasOwnProperty('mouseScroll') ? config.mouseScroll : this.config().mouseScroll;
this._overObject = null;
this._clickedObject = null;
}
get hook() {
return this._hook;
}
get renderer() {
return this._renderer;
}
get scene() {
return this._scene;
}
get camera() {
return this._camera;
}
get root() {
return this._root;
}
get projector() {
return this._projector;
}
get objects() {
return this._objects;
}
get handleKeyUp() {
return this._handleKeyUp;
}
get handleKeyDown() {
return this._handleKeyDown;
}
get handleKeyPress() {
return this._handleKeyPress;
}
get handleMouseMove() {
return this._handleMouseMove;
}
get handleMouseDown() {
return this._handleMouseDown;
}
get handleMouseUp() {
return this._handleMouseUp;
}
get handleMouseScroll() {
return this._handleMouseScroll;
}
get clickedObject() {
return this._clickedObject;
}
set clickedObject(o) {
this._clickedObject = o;
}
get overObject() {
return this._overObject;
}
set overObject(o) {
this._overObject = o;
}
onDocumentMouseMove(event) {
event.preventDefault();
if (this.clickedObject && this.clickedObject.handleMouseMove) {
let hitpoint = null,
hitnormal = null;
let intersected = this.objectFromMouse(event.pageX, event.pageY);
if (intersected.object == this.clickedObject) {
hitpoint = intersected.point;
hitnormal = intersected.normal;
}
this.clickedObject.handleMouseMove(event.pageX, event.pageY, hitpoint, hitnormal);
} else {
let handled = false;
let oldObj = this.overObject;
let intersected = this.objectFromMouse(event.pageX, event.pageY);
this.overObject = intersected.object;
if (this.overObject != oldObj) {
if (oldObj) {
this.hook.style.cursor = 'auto';
if (oldObj.handleMouseOut) {
oldObj.handleMouseOut(event.pageX, event.pageY);
}
}
if (this.overObject) {
if (this.overObject.overCursor) {
this.hook.style.cursor = this.overObject.overCursor;
}
if (this.overObject.handleMouseOver) {
this.overObject.handleMouseOver(event.pageX, event.pageY);
}
}
handled = true;
}
if (!handled && this.handleMouseMove) {
this.handleMouseMove(event.pageX, event.pageY);
}
}
}
onDocumentMouseDown(event) {
event.preventDefault();
let handled = false;
let intersected = this.objectFromMouse(event.pageX, event.pageY);
if (intersected.object) {
if (intersected.object.handleMouseDown) {
intersected.object.handleMouseDown(event.pageX, event.pageY, intersected.point, intersected.normal);
this.clickedObject = intersected.object;
handled = true;
}
}
if (!handled && this.handleMouseDown) {
this.handleMouseDown(event.pageX, event.pageY);
}
}
onDocumentMouseUp(event) {
event.preventDefault();
let handled = false;
let intersected = this.objectFromMouse(event.pageX, event.pageY);
if (intersected.object) {
if (intersected.object.handleMouseUp) {
intersected.object.handleMouseUp(event.pageX, event.pageY, intersected.point, intersected.normal);
handled = true;
}
}
if (!handled && this.handleMouseUp) {
this.handleMouseUp(event.pageX, event.pageY);
}
this.clickedObject = null;
}
onDocumentMouseScroll(event, delta) {
event.preventDefault();
if (this.handleMouseScroll) {
this.handleMouseScroll(delta);
}
}
onKeyUp(event) {
event.preventDefault();
if (this.handleKeyUp) {
this.handleKeyUp(event.keyCode, event.charCode);
}
}
onKeyDown(event) {
event.preventDefault();
if (this.handleKeyUp) {
this.handleKeyUp(event.keyCode, event.charCode);
}
}
onKeyPress(event) {
event.preventDefault();
if (this.handleKeyPress) {
this.handleKeyPress(event.keyCode, event.charCode);
}
}
onWindowResize(event) {
this.renderer.setSize(this.hook.offsetWidth, this.hook.offsetHeight);
this.camera.aspect = this.hook.offsetWidth / this.hook.offsetHeight;
this.camera.updateProjectionMatrix();
}
objectFromMouse(pagex, pagey) {
let offset = $(this.renderer.domElement).offset();
let eltx = pagex - offset.left;
let elty = pagey - offset.top;
let vpx = (eltx / this.hook.offsetWidth) * 2 - 1;
let vpy = -(elty / this.hook.offsetHeight) * 2 + 1;
let vector = new THREE.Vector3(vpx, vpy, 0.5);
this.projector.unprojectVector(vector, this.camera);
let ray = new THREE.Ray(this.camera.position, vector.subSelf(this.camera.position).normalize());
let intersects = ray.intersectScene(this.scene);
if (intersects.length > 0) {
let i = 0;
while (!intersects[i].object.visible) {
i++;
}
let intersected = intersects[i];
let mat = new THREE.Matrix4().getInverse(intersected.object.matrixWorld);
let point = mat.multiplyVector3(intersected.point);
return (this.findObjectFromIntersected(intersected.object, intersected.point, intersected.face.normal));
} else {
return {
object: null,
point: null,
normal: null
};
}
}
findObjectFromIntersected(object, point, normal) {
if (object.data) {
return {
object: object.data,
point: point,
normal: normal
};
} else if (object.parent) {
return this.findObjectFromIntersected(object.parent, point, normal);
} else {
return {
object: null,
point: null,
normal: null
};
}
}
addObject(obj) {
if (obj) {
this._objects.push(obj);
if (obj.object3D) {
this._root.add(obj.object3D);
}
}
}
removeObject(obj) {
var index = this.objects.indexOf(obj);
if (index != -1) {
this.objects.splice(index, 1);
if (obj.object3D) {
this.root.remove(obj.object3D);
}
}
}
initMouseListeners() {
let dom = this.renderer.domElement,
that = this;
dom.addEventListener('mousemove',
function(e) {
that.onDocumentMouseMove(e);
}, false);
dom.addEventListener('mousedown',
function(e) {
that.onDocumentMouseDown(e);
}, false);
dom.addEventListener('mouseup',
function(e) {
that.onDocumentMouseUp(e);
}, false);
$(dom).mousewheel(
function(e, delta) {
that.onDocumentMouseScroll(e, delta);
}
);
}
initKeyboardListeners() {
let dom = this.renderer.domElement;
let that = this;
dom.addEventListener('keydown',
function(e) {
that.onKeyDown(e);
}, false);
dom.addEventListener('keyup',
function(e) {
that.onKeyUp(e);
}, false);
dom.addEventListener('keypress',
function(e) {
that.onKeyPress(e);
}, false);
dom.setAttribute("tabindex", 1);
dom.style.outline = 'none';
}
initWindowListeners() {
let that = this;
window.addEventListener('resize', function(event) {
that.onWindowResize(event);
}, false);
}
init(config) {
let myConfig = config || {},
container = myConfig.container,
canvas = myConfig.canvas,
renderer,
scene,
camera,
root,
projector;
renderer = new THREE.WebGLRenderer({
antialias: true,
canvas: canvas
});
renderer.setSize(container.offsetWidth, container.offsetHeight);
container.appendChild(renderer.domElement);
scene = new THREE.Scene();
scene.add(new THREE.AmbientLight(0x505050));
scene.data = this;
camera = new THREE.PerspectiveCamera(45, container.offsetWidth / conta.........完整代码请登录后点击上方下载按钮下载查看
网友评论0