基于Threejs构建的3D立体空间实战入门

简介: 本文将简单介绍Threejs的相关基础知识,四个基础对象组件。最后采用一个实例一步一步的进行3D房间展示,最终达到可视化的效果。

     在现实生活中,我们有许多场景需要对真实世界进行还原,仿真。因此会有很多3D的展示需求,同时要求可以基于浏览器就可以深度交互浏览。这里关于3D方面的内容不进行赘述,同时关于opengl和webgl的发展历史,感兴趣的各位同学可以自行参阅相关资料。本文将简单介绍Threejs的基础对象,然后基于threejs构建一个简单的3d房间模型,并模拟拖动房间模型。

     首先简单介绍下Threejs的一些常见组件,罗列比较重要的几个对象。

     1、scene场景。场景是整个3D世界的承载体,所有的对象都在场景中进行统一展示,比如模型、相机、粒子、灯光等等。

     2、Object 对象。对象就是3D世界中的各个对象,比如模型、粒子等等。

     3、Camera相机。3D世界中观察的视角,想要看到场景中的各种对象,必须要借助相机。用相机模拟人眼去观察所有。表示如下:

image.png

image.png

4、WebGLRender,渲染器。所有对象想要完成可视化,都必须要通过渲染器完成。

下面将结合一个具体的例子,来具体说明如何采用原生的方式来定义并操控一个3D场景,完成房间的可视化。

第一步、为了要在网页中渲染对象,因此要定义一个div容器,用于绑定场景渲染信息。

<divid="Stats-output"></div><!-- Div which will hold the Output --><divid="WebGL-output"></div><divid="logInfo"style="position: absolute; top: 0px; left: 20%; width: 50%; padding: 5px;"></div>

WebGl-output用于渲染整个场景,在threejs中创建场景非常简单,见如下核心代码:

var scene, camera, webGLRenderer, stats;
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);
camera.position.x = 20;
camera.position.y = 40;
camera.position.z = 50;
camera.lookAt(scene.position);
scene.add(camera);

第三步、创建webgl渲染器

// create a render and set the size
webGLRenderer = new THREE.WebGLRenderer({
    antialias : true,
    alpha:true
});
webGLRenderer.setClearColor(new THREE.Color(0xEEEEEE, 1.0));
webGLRenderer.setSize(window.innerWidth, window.innerHeight);
webGLRenderer.shadowMapEnabled = true;

第四步、创建外墙、并设置灯管信息,将对象添加到渲染器中

 var paintFloor = function (){
        var loader = new THREE.TextureLoader;
        loader.load('images/floor.png', function (texture) {
            //x和y超过图片像素之后重复绘制图片
            texture.wrapS = texture.wrapT = THREE.RepeatWrapping;
            //设置地板重复绘制的密度是1 * 1
            texture.repeat.set(1, 1);
            //设置材质是双面材质
            var material = new THREE.MeshLambertMaterial({
                map : texture,
                side : THREE.DoubleSide
            });
            //创建普通的平面几何体
            var gemotery = new THREE.PlaneGeometry(40,40);
            //创建网格对象
            var mesh = new THREE.Mesh(gemotery,material);
            mesh.position.y = 0;
            mesh.rotation.x = Math.PI/2;
            scene.add(mesh);
        });
    }
var paintWalls = function (width, depth, height, x, y, z, rotationX, rotationY, rotationZ){
        var loader = new THREE.TextureLoader;
        loader.load('images/wall.png', function (texture) {
            //x和y超过图片像素之后重复绘制图片
            texture.wrapS = texture.wrapT = THREE.RepeatWrapping;
            //设置地板重复绘制的密度是1 * 1
            texture.repeat.set(1,1);
            var material = new THREE.MeshLambertMaterial({
                map : texture,
                side : THREE.DoubleSide
            });
            //创建长方体几何体
            var gemotery = new THREE.BoxGeometry(width, depth, height);
            //创建网格对象以及进行位置的设定
            var mesh = new THREE.Mesh(gemotery,material);
            mesh.position.set(x,y,z)
            mesh.rotation.x = Math.PI * rotationX;
            mesh.rotation.y = Math.PI * rotationY;
            if(rotationZ){
                mesh.rotation.z = Math.PI * rotationZ;
            }
            scene.add(mesh);
        });
    }
function initObjects(){
        paintFloor();
        //画墙--一般y取高度的1/2
        paintWalls(40, 2, 10, 0, 5, -20, 1/2,0);//后面墙
        paintWalls(40, 2, 10, 0, 5, 20, 1/2, 0);//前面墙
        paintWalls(42, 2, 10, -20, 5, 0, 1/2, 0, 1/2);//左面墙
        paintWalls(42, 2, 10, 20, 5, 0, 1/2, 0, 1/2);//右面墙
        initTrackballControls();
    }
// add spotlight for the shadows
var spotLight = new THREE.PointLight(0xffffff);
spotLight.position.set(30, 40, 50);
scene.add(spotLight);
initObjects();
// add the output of the renderer to the html element
document.getElementById("WebGL-output").appendChild(webGLRenderer.domElement);

通过以上步骤就完成一个比较入门级别的3D房间展示,即场景的创建、相机添加、webGL渲染等周期。使用chrome浏览器访问页面可以看到以下的效果:

image.png

image.png

总结:本文将简单介绍Threejs的相关基础知识,四个基础对象组件。最后采用一个实例一步一步的进行3D房间展示,最终达到可视化的效果。

目录
相关文章
Threejs入门进阶实战案例(5):坐标系理解时辅助坐标系的使用
Threejs入门进阶实战案例(5):坐标系理解时辅助坐标系的使用
162 0
|
5月前
|
JavaScript 数据可视化 图形学
iCraft Editor - 助你轻松绘制出色的立体架构图
iCraft Editor是一款创新工具,专为绘制立体架构图设计,带来直观且吸引人的3D视觉体验。它简化了复杂系统的表达,支持自由旋转与缩放,让用户从多角度审视设计。简洁界面与丰富图形库让操作变得简单快捷,即使是新手也能迅速上手。iCraft Editor支持子场景嵌套及外部模型导入,适用于软件架构设计、系统部署维护等多种场景,提升沟通效率。无需编程基础,即可在线免费使用,轻松实现复杂设计的可视化。开启3D新视角,让您的创意无限延伸![官网](https://icraft.gantcloud.com)
942 1
iCraft Editor - 助你轻松绘制出色的立体架构图
|
5月前
|
前端开发
【threejs教程】终于搞明白了!原来threejs中的透视相机这么简单!
【8月更文挑战第5天】深入学习threejs中的透视相机!
199 2
|
5月前
|
图形学 开发者 存储
超越基础教程:深度拆解Unity地形编辑器的每一个隐藏角落,让你的游戏世界既浩瀚无垠又细节满满——从新手到高手的全面技巧升级秘籍
【8月更文挑战第31天】Unity地形编辑器是游戏开发中的重要工具,可快速创建复杂多变的游戏环境。本文通过比较不同地形编辑技术,详细介绍如何利用其功能构建广阔且精细的游戏世界,并提供具体示例代码,展示从基础地形绘制到植被与纹理添加的全过程。通过学习这些技巧,开发者能显著提升游戏画面质量和玩家体验。
244 3
|
5月前
|
编解码 JavaScript 前端开发
ThreeJs 基础学习
ThreeJs 基础学习
67 0
|
5月前
|
数据可视化 图形学
小功能⭐️Unity2018 Shader Graph——全息影像、物体消融
小功能⭐️Unity2018 Shader Graph——全息影像、物体消融
|
前端开发 JavaScript
Threejs入门进阶实战案例(3):视频贴图的解决方案
Threejs入门进阶实战案例(3):视频贴图的解决方案
390 0
|
8月前
|
C# 图形学
【Unity 3D】元宇宙案例之虚拟地球信息射线实战(附源码、演示视频和步骤 超详细)
【Unity 3D】元宇宙案例之虚拟地球信息射线实战(附源码、演示视频和步骤 超详细)
133 0
|
监控 vr&ar Swift
visionOS空间计算实战开发教程Day 5 纹理和材质
本文中我们会通过纹理和材质对这个立方体的六个面分别进行不同的绘制。首先我们将ImmersiveView分拆出来,先新建一个ImmersiveView.swift文件,这是一个视图文件,所以请选择User Interface下的Swift View完成创建,其中的内容待我们编写完ViewModel中的代码后再进行修改。
115 0
|
前端开发
前端知识案例学习15-实现3d得旋转
前端知识案例学习15-实现3d得旋转
97 0
前端知识案例学习15-实现3d得旋转