3.js - Water2不显示水波纹

news/2024/9/20 12:55:24

文中需要的资源,在我的资源那里能下载

【3.js 有2个水的生成方式:Water、Water2】

注意: 这个问题,是基于 Water2

如下方式,不显示波纹

import * as THREE from 'three'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'
import { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js'
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'// 导入water
import { Water } from 'three/examples/jsm/objects/Water2.js'const scene = new THREE.Scene()const camera = new THREE.PerspectiveCamera(90, window.innerWidth / window.innerHeight, 0.1, 1000)
camera.position.set(5, 5, 5)
scene.add(camera)const axesHelper = new THREE.AxesHelper(5)
scene.add(axesHelper)// --------------------------------------------------------------------------// THREE.PlaneGeometry:平面网格,尺寸是20*20,并指定u和v方向的细分数量是1024、1024
const water = new Water(new THREE.PlaneGeometry(1, 1, 1024, 1024), {color: '#ffffff',scale: 1,flowDirection: new THREE.Vector2(1, 1),textureHeight: 1024,textureWidth: 1024,
})
water.rotation.x = -Math.PI / 2
scene.add(water)// --------------------------------------------------------------------------// 环境光
const light = new THREE.AmbientLight(0xffffff)
light.intensity = 10
scene.add(light)
// 平行光
const directionalLight = new THREE.DirectionalLight(0xffffff, 0.5)
scene.add(directionalLight)// 初始化渲染器
const renderer = new THREE.WebGLRenderer()
/*最新版本属性名字有改变:渲染器属性名`.outputEncoding`已经变更为`.outputColorSpace`
*/
renderer.outputEncoding = THREE.sRGBEncoding // 设置渲染器的输出编码方式(此API已弃用)
// renderer.outputColorSpace = THREE.SRGBColorSpace // 设置渲染器的输出编码方式(此API已启用)
renderer.toneMapping = THREE.ACESFilmicToneMapping
renderer.setSize(window.innerWidth, window.innerHeight)
document.body.appendChild(renderer.domElement)const controls = new OrbitControls(camera, renderer.domElement)
controls.enableDamping = trueconst animate = () => {// controls.update()requestAnimationFrame(animate)renderer.render(scene, camera)
}
animate()window.addEventListener('resize', () => {// 重置相机的宽高比camera.aspect = window.innerWidth / window.innerHeight// 更新相机的投影矩阵camera.updateProjectionMatrix()// 重置渲染器的宽高比renderer.setSize(window.innerWidth, window.innerHeight)// 更新渲染器的像素比renderer.setPixelRatio(window.devicePixelRatio)
})

为什么没有呢?

原因
源码中是:
const normalMap0 = options.normalMap0 || textureLoader.load( ‘textures/water/Water_1_M_Normal.jpg’ )。同理normalMap1。
但是,
我们项目安装的three.js源码并没有这个两个纹理图片,
所以,不会显示水波纹

解决办法

把这两个纹理图片,放到 【three-01\public\textures\water】 目录下,这样源码就能找到这两个图片了,就有水波纹了
如下图,
在这里插入图片描述
下面是正确的代码


import * as THREE from 'three'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'
import { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js'
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'// 导入water
import { Water } from 'three/examples/jsm/objects/Water2.js'const scene = new THREE.Scene()const camera = new THREE.PerspectiveCamera(90, window.innerWidth / window.innerHeight, 0.1, 1000)
camera.position.set(5, 5, 5)
scene.add(camera)const axesHelper = new THREE.AxesHelper(5)
scene.add(axesHelper)// --------------------------------------------------------------------------// THREE.PlaneGeometry:平面网格,尺寸是20*20,并指定u和v方向的细分数量是1024、1024
const water = new Water(new THREE.PlaneGeometry(1, 1, 1024, 1024), {color: '#ffffff',scale: 1,flowDirection: new THREE.Vector2(1, 1),textureHeight: 1024,textureWidth: 1024,normalMap0: new THREE.TextureLoader().load('../public/textures/water/Water_1_M_Normal.jpg', texture => {texture.wrapS = texture.wrapT = THREE.RepeatWrapping}), // 水的纹理,不加就是个平面,没有动态的normalMap1: new THREE.TextureLoader().load('../public/textures/water/Water_2_M_Normal.jpg', texture => {texture.wrapS = texture.wrapT = THREE.RepeatWrapping}) // 水的纹理,不加就是个平面,没有动态的
})
water.rotation.x = -Math.PI / 2
scene.add(water)// --------------------------------------------------------------------------// 环境光
const light = new THREE.AmbientLight(0xffffff)
light.intensity = 10
scene.add(light)
// 平行光
const directionalLight = new THREE.DirectionalLight(0xffffff, 0.5)
scene.add(directionalLight)// 初始化渲染器
const renderer = new THREE.WebGLRenderer()
/*最新版本属性名字有改变:渲染器属性名`.outputEncoding`已经变更为`.outputColorSpace`
*/
renderer.outputEncoding = THREE.sRGBEncoding // 设置渲染器的输出编码方式(此API已弃用)
// renderer.outputColorSpace = THREE.SRGBColorSpace // 设置渲染器的输出编码方式(此API已启用)
renderer.toneMapping = THREE.ACESFilmicToneMapping
renderer.setSize(window.innerWidth, window.innerHeight)
document.body.appendChild(renderer.domElement)const controls = new OrbitControls(camera, renderer.domElement)
controls.enableDamping = trueconst animate = () => {// controls.update()requestAnimationFrame(animate)renderer.render(scene, camera)
}
animate()window.addEventListener('resize', () => {// 重置相机的宽高比camera.aspect = window.innerWidth / window.innerHeight// 更新相机的投影矩阵camera.updateProjectionMatrix()// 重置渲染器的宽高比renderer.setSize(window.innerWidth, window.innerHeight)// 更新渲染器的像素比renderer.setPixelRatio(window.devicePixelRatio)
})

https://dhexx.cn/news/show-5415251.html

相关文章

9、Django Admin优化查询

如果你的Admin后台中有很多计算字段,那么你需要对每个对象运行多个查询,这会使你的Admin后台变得非常慢。要解决此问题,你可以重写管理模型中的get_queryset方法使用annotate聚合函数来计算相关的字段。 以下示例为Origin模型的中ModelAdmin…

SSH免密登录(Mac版)

1、查看ssh版本确保已安装 ssh -V 2、生成密钥对 ssh-keygen (我之前安装过了所以选no) 3、将公钥追加到需要设置免密登录的服务器上 使用ssh-copy-id命令进行追加ssh-copy-id -i id_rsa.pub useridip ( userid 和 ip 需要对应换成自己的)

JavaScript 在 VSCode 中的开发体验

JavaScript 在 VSCode 中的开发体验 JavaScript 是一种广泛使用的编程语言,它让网页变得生动有趣。而 VSCode(Visual Studio Code)则是一款非常流行的代码编辑器,以其强大的功能和灵活性著称。在这篇文章中,我们将探讨在 VSCode 中使用 JavaScript 进行开发的体验,包括其…

【项目一】基于pytest的自动化测试框架day1

day1不涉及编写代码,只简单梳理接口测试相关的概念。 day1接口测试的本质:功能测试的一部分测试用例的设计与实现接口调试与自动化:从postman到持续集成补充概念 day1 接口测试的本质:功能测试的一部分 接口测试是功能测试的一部…

计算机毕业设计Spark+PyTorch知识图谱房源推荐系统 房价预测系统 房源数据分析 房源可视化 房源大数据大屏 大数据毕业设计 机器学习

《SparkPyTorch知识图谱房源推荐系统》开题报告 一、选题背景与意义 1.1 选题背景 随着互联网的快速发展和大数据技术的广泛应用,房地产行业特别是房屋租赁市场迎来了前所未有的变革。房源信息的海量增长使得用户在寻找合适的房源时面临巨大挑战。传统的房源推荐…

MATLAB GUI图形化界面实现科学计算器 (代码/报告)

完整的论文代码见文章末尾 以下为核心内容 部分代码 function varargout calc_project(varargin) gui_Singleton 1; gui_State struct(gui_Name, mfilename, ...gui_Singleton, gui_Singleton, ...gui_OpeningFcn, calc_project_OpeningFcn, ...gui_OutputFcn, ca…

MyBaits 二级缓存原理

优质博文:IT-BLOG-CN 一级缓存原理 默认关闭,一般不建议使用。为什么不建议使用我们要清楚。 先给不建议使用的原因: MyBatis的二级缓存是和命名空间绑定的,所以通常情况下每一个Mapper映射文件都拥有自己的二级缓存,…

Chainlit快速实现AI聊天的API接口提供给小程序或者APP等第三方应用

API接口 您可以将 Chainlit 应用安装到现有 FastAPI 应用上以创建自定义端点。一个很好的用例是通过 rest API 为助手提供服务。Chainlit本身就是前后端分离的服务,只不过是把前端文件打包后集成到Chainlit包内部了,打开Chainlit的聊天网页,…

区块链layer2和layer1的划分依据

区块链 layer2 和 layer1 的划分依据 区块链 layer2 和 layer1 的划分主要依据以下几个方面: 功能和作用 Layer1:主要解决区块链的底层基础架构问题,包括数据层、共识层和激励层等。它确保了区块链的去中心化、安全性和最终状态的确认&…