html5 cube,animate-cube.html

Animate a cube

body {

/* set margin to 0 and overflow to hidden, to go fullscreen */

margin: 0;

overflow: hidden;

font-family: consolas;

}

// global variables

var renderer;

var scene;

var camera;

var control;

var stats;

var cameraControl;

var isTweening = false;

function createCube() {

var cubeGeometry = new THREE.BoxGeometry(4, 4, 4);

var cubeMaterial = new THREE.MeshLambertMaterial({color: 0xff0000, transparent: true, opacity: 0.6});

var cube = new THREE.Mesh(cubeGeometry, cubeMaterial);

cube.castShadow = true;

cube.name = 'cube';

cube.position = new THREE.Vector3(2, 2, 0);

scene.add(cube);

return cube;

}

/**

* Initializes the scene, camera and objects. Called when the window is

* loaded by using window.onload (see below)

*/

function init() {

// create a scene, that will hold all our elements such as objects, cameras and lights.

scene = new THREE.Scene();

// create a camera, which defines where we're looking at.

camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);

// create a render, sets the background color and the size

renderer = new THREE.WebGLRenderer({antialias: true});

renderer.setClearColor(0x000000, 1.0);

renderer.setSize(window.innerWidth, window.innerHeight);

renderer.shadowMapEnabled = true;

// create the ground plane

var planeGeometry = new THREE.PlaneGeometry(120, 120, 20, 20);

var planeMaterial = new THREE.MeshLambertMaterial({color: 0xcccccc});

var plane = new THREE.Mesh(planeGeometry, planeMaterial);

plane.receiveShadow = true;

// rotate and position the plane

plane.rotation.x = -0.5 * Math.PI;

plane.position.x = 0;

plane.position.y = 0;

plane.position.z = 0;

// add the plane to the scene

scene.add(plane);

var cube = createCube();

// add coordinate axies

drawCoordinateAxies(scene);

// position and point the camera to the center of the scene

camera.position.x = 10;

camera.position.y = 16;

camera.position.z = 15;

camera.lookAt(scene.position);

cameraControl = new THREE.OrbitControls(camera);

// add spotlight for the shadows

var spotLight = new THREE.SpotLight(0xffffff);

spotLight.position.set(20, 40, 20);

spotLight.shadowCameraNear = 20;

spotLight.shadowCameraFar = 150;

spotLight.castShadow = true;

scene.add(spotLight);

// setup the control object for the control gui

control = new function () {

this.rotationSpeed = 0.005;

this.opacity = 0.6;

this.color = cube.material.color.getHex();

this.forward = function () {

takeStepForward(scene.getObjectByName('cube'), 0, 0.5 * Math.PI, 2000);

};

this.back = function () {

takeStepBackward(scene.getObjectByName('cube'), 0, 0.5 * Math.PI, 2000);

};

this.left = function () {

takeStepLeft(scene.getObjectByName('cube'), 0, 0.5 * Math.PI, 2000);

};

this.right = function () {

takeStepRight(scene.getObjectByName('cube'), 0, 0.5 * Math.PI, 2000);

};

};

// add extras

addControlGui(control);

addStatsObject();

// add the output of the renderer to the html element

document.body.appendChild(renderer.domElement);

// call the render function, after the first render, interval is determined

// by requestAnimationFrame

render();

}

function takeStepRight(cube, start, end, time) {

var cubeGeometry = cube.geometry;

var widht = 4;

if (!isTweening) {

var tween = new TWEEN.Tween({ x: start, cube: cube, previous: 0})

.to({ x: end }, time )

.easing(TWEEN.Easing.Linear.None)

.onStart(function () {

cube.position.y += -widht / 2;

cube.position.z += -widht / 2;

cubeGeometry.applyMatrix(new THREE.Matrix4().makeTranslation(0, widht / 2, widht / 2));

})

.onUpdate(function () {

cube.geometry.applyMatrix(new THREE.Matrix4().makeRotationX(-(this.x - this.previous)));

cube.geometry.verticesNeedUpdate = true;

cube.geometry.normalsNeedUpdate = true;

this.previous = this.x;

})

.onComplete(function () {

cube.position.y += 2;

cube.position.z += -2;

cubeGeometry.applyMatrix(new THREE.Matrix4().makeTranslation(0, -widht / 2, widht / 2));

cube.position.x = Math.round(cube.position.x);

cube.position.y = Math.round(cube.position.y);

cube.position.z = Math.round(cube.position.z);

isTweening = false;

})

.start();

}

}

function takeStepLeft(cube, start, end, time) {

var cubeGeometry = cube.geometry;

var widht = 4;

if (!isTweening) {

var tween = new TWEEN.Tween({ x: start, cube: cube, previous: 0})

.to({ x: end }, time )

.easing(TWEEN.Easing.Linear.None)

.onStart(function () {

isTweening = true;

cube.position.y += -widht / 2;

cube.position.z += widht / 2;

cubeGeometry.applyMatrix(new THREE.Matrix4().makeTranslation(0, widht / 2, -widht / 2));

})

.onUpdate(function () {

cube.geometry.applyMatrix(new THREE.Matrix4().makeRotationX(this.x - this.previous));

cube.geometry.verticesNeedUpdate = true;

cube.geometry.normalsNeedUpdate = true;

this.previous = this.x;

})

.onComplete(function () {

cube.position.y += 2;

cube.position.z += 2;

cubeGeometry.applyMatrix(new THREE.Matrix4().makeTranslation(0, -widht / 2, -widht / 2));

cube.position.x = Math.round(cube.position.x);

cube.position.y = Math.round(cube.position.y);

cube.position.z = Math.round(cube.position.z);

isTweening = false;

})

.start();

}

}

function takeStepBackward(cube, start, end, time) {

var widht = 4;

var cubeGeometry = cube.geometry;

if (!isTweening) {

var tween = new TWEEN.Tween( { x: start, cube: cube, previous: 0} )

.to( { x: end }, time )

.easing( TWEEN.Easing.Linear.None )

.onStart( function() {

isTweening = true;

cube.position.y+=-widht/2;

cube.position.x+=widht/2;

cubeGeometry.applyMatrix(new THREE.Matrix4().makeTranslation( -widht/2, widht/2, 0 ) );

})

.onUpdate( function () {

cube.geometry.applyMatrix( new THREE.Matrix4().makeRotationZ( -(this.x-this.previous) ) );

cube.geometry.verticesNeedUpdate=true;

cube.geometry.normalsNeedUpdate = true;

cube.previous = this.x;

this.previous = this.x;

} )

.onComplete(function() {

cube.position.y+=2;

cube.position.x+=2;

cubeGeometry.applyMatrix(new THREE.Matrix4().makeTranslation( -widht/2, -widht/2, 0 ) );

cube.position.x=Math.round(cube.position.x);

cube.position.y=Math.round(cube.position.y);

cube.position.z=Math.round(cube.position.z);

isTweening = false;

})

.start();

}

}

function takeStepForward(cube, start, end, time) {

var widht = 4;

var cubeGeometry = cube.geometry;

if (!isTweening) {

var tween = new TWEEN.Tween( { x: start, cube: cube, previous: 0} )

.to( { x: end }, time )

.easing( TWEEN.Easing.Linear.None )

.onStart( function() {

isTweening = true;

cube.position.y+=-widht/2;

cube.position.x+=-widht/2;

cubeGeometry.applyMatrix(new THREE.Matrix4().makeTranslation( widht/2, widht/2, 0 ) );

})

.onUpdate( function () {

cube.geometry.applyMatrix( new THREE.Matrix4().makeRotationZ( (this.x-this.previous) ) );

cube.geometry.verticesNeedUpdate=true;

cube.geometry.normalsNeedUpdate = true;

cube.previous = this.x;

this.previous = this.x;

} )

.onComplete(function() {

cube.position.y+=widht/2;

cube.position.x+=-widht/2;

cubeGeometry.applyMatrix(new THREE.Matrix4().makeTranslation( widht/2, -widht/2, 0 ) );

cube.position.x=Math.round(cube.position.x);

cube.position.y=Math.round(cube.position.y);

cube.position.z=Math.round(cube.position.z);

isTweening = false;

})

.start();

}

}

function addControlGui(controlObject) {

var gui = new dat.GUI();

gui.add(controlObject,'forward');

gui.add(controlObject,'back');

gui.add(controlObject,'left');

gui.add(controlObject,'right');

}

function addStatsObject() {

stats = new Stats();

stats.setMode(0);

stats.domElement.style.position = 'absolute';

stats.domElement.style.left = '0px';

stats.domElement.style.top = '0px';

document.body.appendChild( stats.domElement );

}

/**

* Called when the scene needs to be rendered. Delegates to requestAnimationFrame

* for future renders

*/

function render() {

// update stats

stats.update();

TWEEN.update();

cameraControl.update();

// and render the scene

renderer.render(scene, camera);

// render using requestAnimationFrame

requestAnimationFrame(render);

}

/**

* Function handles the resize event. This make sure the camera and the renderer

* are updated at the correct moment.

*/

function handleResize() {

camera.aspect = window.innerWidth / window.innerHeight;

camera.updateProjectionMatrix();

renderer.setSize(window.innerWidth, window.innerHeight);

}

// calls the init function when the window is done loading.

window.onload = init;

// calls the handleResize function when the window is resized

window.addEventListener('resize', handleResize, false);

一键复制

编辑

Web IDE

原始数据

按行查看

历史

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值