用threejs 实现3D物体在浏览器展示
用threejs 实现3D物体在浏览器展示,通过鼠标平移,缩放,键盘箭头按钮左右移动等功能展示。
<!DOCTYPE html> <html>
<head>
<meta charset=utf->
<title>My first three.js app</title>
<style>
* { margin: ; }
canvas { width: %; height: %;}
</style>
</head>
<body>
</body>
<script src="https://cdn.bootcss.com/three.js/91/three.js"></script>
<script>
var iswireframe = false;
var scene , camera , renderer;
var fov = , //拍摄距离 视野角值越大,场景中的物体越小
near = ,//相机离视体积最近的距离
far = ;//相机离视体积最远的距离;
var cameraX = , cameraY = , cameraZ = ;
var sceneX = , sceneZ = ;
document.body.style.cursor="move";
function initFloor(){
var floorGeometry = new THREE.BoxGeometry( , 0.01, );
//var material = new THREE.MeshBasicMaterial( { color: "green", wireframe : iswireframe } );
for ( var i = ; i < floorGeometry.faces.length; i++ ) {
floorGeometry.faces[ i ].color.set( 0xEEEED1 );
}
var material = new THREE.MeshBasicMaterial( { vertexColors: THREE.FaceColors, wireframe : iswireframe } );
var floor = new THREE.Mesh( floorGeometry, material );
scene.add( floor );
} function initGrid(){ //辅助网格
var helper = new THREE.GridHelper( , );
//helper.setColors( 0x0000ff, 0x808080 );
scene.add( helper );
} function initBuild1(){
var buildingGeometry1 = new THREE.BoxGeometry(, , );
for ( var i = ; i < buildingGeometry1.faces.length; i++ ) {
buildingGeometry1.faces[i].color.setHex( Math.random() * 0xffffff );
}
var building1 = new THREE.Mesh(
buildingGeometry1,
new THREE.MeshBasicMaterial({vertexColors: THREE.FaceColors, wireframe : iswireframe})
);
building1.position.set(, , );
scene.add(building1);
} function buildColor(geometry){
for ( let i = ; i < geometry.faces.length; i++ ) {
geometry.faces[i].color.setHex( Math.random() * 0xffffff );
}
} function initWall(){
let wallColor = 0xEBEBEB;
let wallHeight = ;
let wallGeometryback = new THREE.BoxGeometry(, wallHeight, 0.1);
console.log(wallGeometryback.faces.length);
//buildColor(wallGeometryback);
let materialParamertes = {color: wallColor, vertexColors: THREE.FaceColors, wireframe : iswireframe, opacity : 0.01};
var wallback = new THREE.Mesh(
wallGeometryback,
new THREE.MeshBasicMaterial(materialParamertes)
);
wallback.position.set(, 0.5, -);
scene.add(wallback); let wallGeometryLeft = new THREE.BoxGeometry(0.1, wallHeight, );
var wallLeft = new THREE.Mesh(
wallGeometryLeft,
new THREE.MeshBasicMaterial(materialParamertes)
);
wallLeft.position.set(-, 0.5, );
scene.add(wallLeft); let wallGeometryRight = new THREE.BoxGeometry(0.1, wallHeight, );
var wallRight = new THREE.Mesh(
wallGeometryRight,
new THREE.MeshBasicMaterial(materialParamertes)
);
wallRight.position.set(, 0.5, );
scene.add(wallRight);
/*
let wallGeometryFront = new THREE.BoxGeometry(20, wallHeight, 0.1);
var wallFront = new THREE.Mesh(
wallGeometryFront,
new THREE.MeshBasicMaterial(materialParamertes)
);
wallFront.position.set(0, 0.5, 3);
scene.add(wallFront);
*/
} function onDocumentKeyDown(event){
switch(event.keyCode){
case : //左
cameraX -= ;
sceneX -=;
break;
case : //右
cameraX += ;
sceneX +=;
break;
case : //上
//fx -= 0.1;
cameraZ -= ;
sceneZ -= ;
break;
case : //下
//fx += 0.1;
cameraZ += ;
sceneZ += ;
break;
default:
break;
}
renderInit();
} function onDocumentMouseWheel(event) {
if (event.wheelDelta) { //判断浏览器IE,谷歌滑轮事件
if (event.wheelDelta > ) { //当滑轮向上滚动时
fov -= (near < fov ? : );
}
if (event.wheelDelta < ) { //当滑轮向下滚动时
fov += (fov < far ? : );
}
} else if (event.detail) { //Firefox滑轮事件
if (event.detail > ) { //当滑轮向上滚动时
fov += ;
}
if (event.detail < ) { //当滑轮向下滚动时
fov -= ;
}
}
//改变fov值,并更新场景的渲染
camera.fov = fov;
renderInit();
} function onDocumentMouseDown(event) {
if (event.button != ) return;
event.preventDefault();
document.addEventListener('mousemove', onDocumentMouseMove, false);
document.addEventListener('mouseup', onDocumentMouseUp, false);
} function onDocumentMouseMove(event) {
var movementX = event.movementX || event.mozMovementX || event.webkitMovementX || ;
var movementY = event.movementY || event.mozMovementY || event.webkitMovementY || ;
//console.log("x="+movementX+" y="+movementY);
cameraX -= movementX * 0.01;
sceneX -= movementX * 0.01;
cameraZ -= movementY * 0.01;
sceneZ -= movementY * 0.01;
renderInit();
} function onDocumentMouseUp(event) {
document.removeEventListener('mousemove', onDocumentMouseMove);
document.removeEventListener('mouseup', onDocumentMouseUp);
} //场景初始化
function sceneInit(){
scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera( fov , window.innerWidth/window.innerHeight, near, far );
//camera.position.set(0, 0, 7);
//相机位置
//cameraX = 0; cameraZ = 8;
camera.up.x = ;
camera.up.y = ; //相机朝向--相机上方为y轴
camera.up.z = ; renderer = new THREE.WebGLRenderer({antialias : true});
renderer.setSize( window.innerWidth - , window.innerHeight - );
renderer.setClearColor(0xFFFFFF, 1.0);
document.body.appendChild( renderer.domElement );
renderer.setClearColor(0xFFFFFF, 1.0); document.addEventListener('keydown',onDocumentKeyDown,false);
document.addEventListener('mousewheel', onDocumentMouseWheel, false);//兼容ie chrome
document.addEventListener('DOMMouseScroll', onDocumentMouseWheel, false);//兼容火狐
document.addEventListener('mousedown', onDocumentMouseDown, false);
initGrid();
initFloor();
initBuild1();
initWall();
} function renderInit(){
camera.position.set(cameraX, cameraY, cameraZ);
camera.lookAt(sceneX, , sceneZ);
camera.updateProjectionMatrix();
renderer.render(scene, camera);
} sceneInit();
renderInit(); //动画
function animate() {
requestAnimationFrame( animate );
// stats.begin();
initAll();
//stats.end();
}
</script>
</html>
用threejs 实现3D物体在浏览器展示的更多相关文章
- 在threejs中对3D物体旋转的思考
今天在写threejs时,突然想到一个问题:一个3D物体需要旋转时,一般情况下简单的旋转我都是使用欧拉角,稍微复杂一些的情况我会把欧拉角转换成四元数进行旋转(欧拉角复杂旋转可能会产生的死锁问题),但是 ...
- 转 threejs中3D视野的缩放实现
Threejs基础部分学习知道透视相机new THREE.PerspectiveCamera(fov, aspect , near,far)中. fov视野角(拍摄距离)越大,场景中的物体越小.fov ...
- 3D图片采集与展示(SurfaceView 自适应 Camera, 录制视频, 抽取帧)
最近在做一个3D图片采集与展示. 主要功能为:自定义Camera(google 已经摈弃了Camera, 推荐使用Camera2,后续篇幅,我将会用Camera2取代Camera),围绕一个物体360 ...
- 在ugui上显示3d物体
1.接下来,使Cube的Layer和背景一样为UI层, 2.在将我们的主相机culling Mask改为UI,如果你还想渲染其他层的物体,可以根据需要该为需要的层,或者直接改为Everyting 3. ...
- Threejs 开发3D地图实践总结【转】
Threejs 开发3D地图实践总结 前段时间连续上了一个月班,加班加点完成了一个3D攻坚项目.也算是由传统web转型到webgl图形学开发中,坑不少,做了一下总结分享. 1.法向量问题 法线是垂 ...
- [Unity官方文档翻译]Primitive and Placeholder Objects Unity原生3D物体教程
Primitive and Placeholder Objects 原始的基础物体 Unity can work with 3D models of any shape that can be cre ...
- threejs和3d各种效果的学习
写给即将开始threejs学习的自己,各种尝试,各种记忆.不要怕,灰色的年华终会过去. 一个技术学习的快慢,以及你的深刻程度,还有你的以后遇到这个东西的时候的反应速度,很大程度上,取决于你的博客的深刻 ...
- 教你如何利用threejs对3D模型皮肤进行DIY
一步一步教你如何利用threejs加载gltf模型来实现DIY换肤功能. 模型准备 模型制作 模型可以通过网上下载,也可以自己通过c4d.maya.blender等模型制作软件得到.这里就不叙述有关模 ...
- HMS Core AR Engine 2D图片/3D物体跟踪技术 助力打造更智能AR交互体验
AR技术已经被广泛应用于营销.教育.游戏.展览等场景.通过2D图像跟踪技术和3D物体跟踪技术,用户只需使用一台手机进行拍摄,即可实现海报.卡牌等平面物体以及文物.手办等立体物体的AR效果.尽管近年来2 ...
随机推荐
- 使用Eclipse开发python
第一步:下载python插件http://sourceforge.net/projects/pydev/files/pydev/PyDev%204.1.0/第二步:在Eclipse上安装插件a.假设E ...
- [kmp,不要过多调用strlen!!!] Codeforces 1200E Compress Words
题目:http://codeforces.com/contest/1200/problem/E Compress Words time limit per test 1 second memory l ...
- Java 访问修饰符大全详解
鉴于笔试面试总会遇到,决心仔细认真梳理一下: 1:涉及的关键字:public,default(表示缺省),protected,private,static,final,abstract. 2:关键字含 ...
- 常见排序算法总结分析之选择排序与归并排序-C#实现
本篇文章对选择排序中的简单选择排序与堆排序,以及常用的归并排序做一个总结分析. 常见排序算法总结分析之交换排序与插入排序-C#实现是排序算法总结系列的首篇文章,包含了一些概念的介绍以及交换排序(冒泡与 ...
- adb软件国产安卓手机对系统的把控
国产安卓手机对系统的把控,现在想搞机的方法是愈来愈麻烦,华为最先的申请解锁码,到现在直接系统锁死不给解.让我等搞机小伙伴是望机兴叹.安卓手机的通病随着系统升级,手机就越来越卡.本想通过卸载系统自带应用 ...
- JavaScript DOM 事件模型
JavaScript DOM 事件模型 JavaScript 是基于面向对象和事件驱动的一门语言,事件模型是 DOM 中至关重要的内容,理解事件驱动机制.事件反馈.事件冒泡.事件捕获以及事件委托能帮助 ...
- 计算机视觉基本原理——RANSAC
公众号[视觉IMAX]第31篇原创文章 一 前言 对于上一篇文章——一分钟详解「本质矩阵」推导过程中,如何稳健地估计本质矩阵或者基本矩阵呢?正是这篇文章重点介绍的内容. 基本矩阵求解方法主要有: 1) ...
- 移植OPENNI到DM6446上面
为了利用摄像头的景深信息,同时利用dm6446的分析功能(dsp),对openNI进行USB移植. 下载:libusb-1.0.0.tar.bz2 OpenNI-Stable-1 ...
- JVM tomcat 性能调优
1,新建web 测试项目并且发布到Tomcat,访问路径:http://127.0.0.1:8080/JvmWeb/index @WebServlet("/index") publ ...
- Java方法调用数组,是否改变原数组元素的总结
Java方法调用数组,是否改变原数组元素的总结 //个人理解, 欢迎吐槽 注意String是引用型变量, 我的理解也就是指向型, 指向一个数据或变量, 画图理解最容易, string 指向的 数据的值 ...