three.js之scene

这篇具有很好参考价值的文章主要介绍了three.js之scene。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

THREE.Scene对象有时被称为场景图,可以用来保存所有图形场景的必要信息。在Three.js中,这意味着THREE.Scene保存所有对象、光源和渲染所需的其他对象。
本节主要是构建一个基本场景,然后可以通过gui添加,删除场景里的对象等。


效果图

three.js之scene

源码

引入的插件js【本人的csdn也有下载资源,如果打不开git可以在csdn下载】:

  • three.js
  • dat.gui.js
  • Stats.js
  • TrackballControls.js
  • util.js[csdn链接]
  • util.js[git链接]
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<link type="text/css" rel="stylesheet" href="../css/index.css" />
		<script src="../libs/three.js"></script>
		<script src="../libs/Stats.js"></script>
		<script src="../libs/dat.gui.js"></script>
		<script src="../libs/TrackballControls.js"></script>
		<script src="../js/util/three_util.js"></script>
	</head>
	<body>
		<div id="webgl-output"></div>
		<script src="../js/2.js"></script>
	</body>
</html>

index.css:

*{
	margin: 0;
	padding: 0;
	box-sizing: border-box;
	/* overflow: hidden; */
}
body {
	overflow: hidden;
}

2.js:

var stats = initStats();
var scene = new THREE.Scene();
// scene的雾化效果
scene.fog = new THREE.Fog(0xffffff, 0.015, 100)
//scene.fog = new THREE.FogExp2(0xffffff, 0.01)
var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 100);
var renderer = new THREE.WebGLRenderer();
renderer.setClearColor(new THREE.Color(0x000000));
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.shadowMap.enabled = true;

var planeGeometry = new THREE.PlaneGeometry(60, 40, 1, 1);
var planeMaterial = new THREE.MeshLambertMaterial({
	color: 0xffffff
});
var plane = new THREE.Mesh(planeGeometry, planeMaterial);
plane.receiveShadow = true;
plane.rotation.x = -0.5 * Math.PI;
plane.position.x = 0;
plane.position.y = 0;
plane.position.z = 0;

// 添加点光源
scene.add(plane);

camera.position.x = -30;
camera.position.y = 40;
camera.position.z = 30;
camera.lookAt(scene.position);

// 添加环境光
var ambientLight = new THREE.AmbientLight(0x3c3c3c);
scene.add(ambientLight);

// 点光源
var spotLight = new THREE.SpotLight(0xffffff, 1.2, 150, 120);
spotLight.position.set(-40, 60, -10);
spotLight.castShadow = true;
scene.add(spotLight);


document.getElementById("webgl-output").appendChild(renderer.domElement);

var step = 0;

var controls = new function () {
	this.rotationSpeed = 0.02;
	this.numberOfObjects = scene.children.length;

	this.removeCube = function () {
		var allChildren = scene.children;
		var lastObject = allChildren[allChildren.length - 1];
		if (lastObject instanceof THREE.Mesh) {
			scene.remove(lastObject);
			this.numberOfObjects = scene.children.length;
		}
	};

	this.addCube = function () {

		var cubeSize = Math.ceil((Math.random() * 3));
		var cubeGeometry = new THREE.BoxGeometry(cubeSize, cubeSize, cubeSize);
		var cubeMaterial = new THREE.MeshLambertMaterial({
			color: Math.random() * 0xffffff
		});
		var cube = new THREE.Mesh(cubeGeometry, cubeMaterial);
		cube.castShadow = true;
		cube.name = "cube-" + scene.children.length;

		cube.position.x = -30 + Math.round((Math.random() * planeGeometry.parameters.width));
		cube.position.y = Math.round((Math.random() * 5));
		cube.position.z = -20 + Math.round((Math.random() * planeGeometry.parameters.height));
		cube.rotation.x += controls.rotationSpeed
		cube.rotation.y += controls.rotationSpeed
		cube.rotation.z += controls.rotationSpeed

		// add the cube to the scene
		scene.add(cube);
		this.numberOfObjects = scene.children.length;
	};

	this.outputObjects = function () {
		console.log(scene.children);
	}
};

var gui = new dat.GUI();
gui.add(controls, 'rotationSpeed', 0, 0.5);
gui.add(controls, 'addCube');
gui.add(controls, 'removeCube');
gui.add(controls, 'outputObjects');
gui.add(controls, 'numberOfObjects').listen();

var trackballControls = initTrackballControls(camera, renderer);
var clock = new THREE.Clock();


render();
function render() {
	stats.update()
	trackballControls.update(clock.getDelta())
	scene.traverse(function (e) {
	    if (e instanceof THREE.Mesh && e != plane) {
	        e.rotation.x += controls.rotationSpeed;
	        e.rotation.y += controls.rotationSpeed;
	        e.rotation.z += controls.rotationSpeed;
	    }
	});
	requestAnimationFrame(render);
	renderer.render(scene, camera);
}

// 定义 resize方法,屏幕尺寸变更时触发
window.addEventListener('resize', onResize, false)
function onResize() {
	// aspect属性,这个属性表示屏幕的长宽比
	camera.aspect = window.innerWidth / window.innerHeight
	camera.updateProjectionMatrix()
	renderer.setSize(window.innerWidth, window.innerHeight)
}

注意点:文章来源地址https://www.toymoban.com/news/detail-413241.html

  • 本节新引入了 ambientLight 环境光的应用;
  • scene的雾化效果scene.fog = new THREE.Fog(0xffffff, 0.015, 100),由近及远,呈线性雾化效果叠加;
  • scene的雾化效果scene.fog = new THREE.FogExp2(0xffffff, 0.01),由近到远,呈指数级增加雾化效果;
  • scene.remove 移除某个对象;
  • scene.add 添加对象;
  • scene.children 遍历场景中的对象;
  • getObjectByName(name, recursive) recursive: 递归的, 依据name查找对象,recursive为false时只查找子元素,为true是查找所有后代元素;
  • traverse(function) 可返回场景中所有元素,也可以使被调用者和其所有后代,都将执行function函数;

到了这里,关于three.js之scene的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • THREE.JS使用详细(three.js创建3d物体,three.js的使用方式)

    简述:three.js封装了WebGL的底层细节,是一款运行在浏览器中的 3D 引擎,可以用它创建各种三维场景,包括了摄影机、光影、材质等各种对象,目前在Git上已经拥有90k+的star,今天用three.js来构建一个三维模型; 1、首先,在项目中需要下载threejs的相关依赖; 2、在js页面引入使

    2024年01月23日
    浏览(84)
  • 【Three.js】Three.js快速上手教程

    官网对 Three.js 的介绍非常简单:“Javascript 3D library”。 即: three.js 是 JavaScript 编写的 WebGL 第三方库。提供了非常多的3D显示功能,是一个常见的 web 3D 库。 相关概念解释:three.js webGL openGL openGL 是一个跨平台3D/2D的绘图标准, webGL 则是 openGL 在浏览器上的一个实现。 web前端

    2024年01月16日
    浏览(57)
  • three.js(四):react + three.js

    绘制多个立方体 1.搭建react+ts 项目 react+ts 的用法可参考此链接: https://react-typescript-cheatsheet.netlify.app/docs/basic/setup 2.安装three依赖 3.安装路由 react-router-v6 的用法可参考此链接:https://juejin.cn/post/7088526716049555492 4.用路由组件包裹APP。 index.tsx 5.构建项目页面 src/view/Basics.tsx src/

    2024年02月11日
    浏览(55)
  • three.js(三):three.js的渲染结构

    概述 three.js 封装了场景、灯光、阴影、材质、纹理和三维算法,不必在直接用WebGL 开发项目,但有的时候会间接用到WebGL,比如自定义着色器。 three.js 在渲染三维场景时,需要创建很多对象,并将它们关联在一起。 下图便是一个基本的three.js 渲染结构 Renderer 渲染器 Renderer

    2024年02月11日
    浏览(43)
  • three.js(二):webpack + three.js + ts

    webpack 依旧是主流的模块打包工具; ts和three.js 是绝配,three.js本身就是用ts写的,ts可以为three 项目提前做好规则约束,使项目的开发更加顺畅。 1.创建一个目录,初始化 npm 2.调整 package.json 文件 确保安装包是 private(私有的) ,并且移除 main 入口。这可以防止意外发布你的代码

    2024年02月11日
    浏览(38)
  • Three.js--》探索Three.js:学习和就业的完整指南

    目录 three.js的学习建议 WebGL前端工程师工作待遇相关问题 本篇文章主要给大家介绍一下如何学习Web3D可视化,具体说就是怎么学习WebGL、Three.js、3D建模等。 three.js的学习建议 在过去互联网是人联网的时代,开发人和人之间的联系的Web应用,对于3D可视化需求不强烈。在物联网

    2024年02月06日
    浏览(37)
  • three.js(一):认识three.js并创建第一个3D应用

    1-three.js 是什么? three.js是用JavaScript编写的WebGL第三方库; three.js 提供了非常多的3D显示和编辑功能; 具体而言,three.js 是一款运行在浏览器中的 3D 引擎,可以用three.js 创建各种三维场景,并对其进行编辑; 在three.js 的官网上看到许多精彩的演示和文档 three.js 官网:https://thre

    2024年02月11日
    浏览(98)
  • 【Three.js】Three.js中的纹理—图像应用和属性调整

      Three.js是一种强大的JavaScript库,用于创建基于Web的交互式3D图形和动画。在Three.js中,纹理是一项重要的功能,它允许我们将图像应用到几何体对象上,并通过调整纹理的属性来实现更丰富的视觉效果。 本文将介绍Three.js中的纹理功能,并演示如何将图片作为纹理应用到几何

    2024年02月15日
    浏览(55)
  • three.js从入门到精通系列教程003 - three.js透视相机(PerspectiveCamera)

    透视相机(PerspectiveCamera) 它是用来模拟人眼所看到的景象,它也是3D场景的渲染中使用得最普遍的投影模式。呈现的效果,类似眼睛看东西,近大远小 源码下载地址: three.js从入门到精通系列教程002 - three.js透视相机(PerspectiveCamera)

    2024年01月19日
    浏览(55)
  • three.js从入门到精通系列教程002 - three.js正交相机OrthographicCamera

    正投影相机-OrthographicCamera,通过正投影相机渲染出来的物体的尺寸都一样,不会因为观察距离的远近而出现近大远小的情况 源码下载地址 three.js从入门到精通系列教程002 - three.js正交相机OrthographicCamera

    2024年01月20日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包