用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 ...
随机推荐
- 初步了解HTTP协议
1.HTTP简介 全称:Hyper Text Transfer Protocol,中文名:超文本传输协议. 功能:HTTP是客户端浏览器或其他程序与web服务器之间的应用层通信协议. 特点:a.支持 ...
- go:内置函数 | 闭包 | 数组 | 切片 | 排序 | map | 锁
内置函数 1.close: 主要是用来关闭channel 2.len:用来求长度,比如string.array.slice.map.channel 3.new与make都是用来分配内存 new用来分配 ...
- python-集合,列表和元组
a = {11,22,33} b = [11,22,33] c = (11,22,33,22) 集合:type(a) -->>set#集合内元素不可重复,花括号括起来的还有 -->& ...
- Docker Data
docker data 六.Docker存储 docker存储驱动storage driver(优先使用linux默认的storage driver,因为比较稳定) ubuntu:aufs,/var/ ...
- 图-搜索-DFS-37. 解数独
2020-03-24 22:23:32 问题描述: 编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次.数字 1-9 在每一列只能出现一 ...
- 贪心-谷歌-857. 雇佣 K 名工人的最低成本
2020-03-15 22:00:39 问题描述: 有 N 名工人. 第 i 名工人的工作质量为 quality[i] ,其最低期望工资为 wage[i] . 现在我们想雇佣 K 名工人组成一个工资组 ...
- Recursive-Brace Expansion II
2019-11-26 11:05:10 1096. Brace Expansion II 问题描述: 问题求解: 经典的字符串扩展问题. 一般来说这种问题有两种解法,一个是采用stack,一个是采用r ...
- 1、Spark Core所处位置和主要职责
Spark组件是基于分布式资源引擎层(Yarn等)和分布式存储层(HDFS等)之上的一个组件,Spark本质上是一个计算引擎,负责计算的,根据不同计算场景划分出了SQL.Streaming.MLib. ...
- python 产生随机数,随机字符串
import randomimport string#随机整数:print random.randint(1,50)#随机选取0到100间的偶数:print random.randrange(0, 1 ...
- 开始 Keras 序列模型(Sequential model)
开始 Keras 序列模型(Sequential model) 序列模型是一个线性的层次堆栈. 你可以通过传递一系列 layer 实例给构造器来创建一个序列模型. The Sequential mod ...