threejs 基础案例之四:点光源,移动光源旋转的小球

 

 

<template>
  <div>
  </div>
</template>

<script setup>
import * as THREE from "three"
import {OrbitControls} from "three/examples/jsm/controls/OrbitControls"
import Dat from "dat.gui"
import { ref } from 'vue'
//场景
const scene=new THREE.Scene()
//相机
const camara=new THREE.PerspectiveCamera(45,window.innerWidth/window.innerHeight,0.1,1000)
camara.position.set(10,10,10)

//平面
const plane=new THREE.Mesh(
    new THREE.PlaneGeometry(10,10,1,1),
    new THREE.MeshStandardMaterial()
)
plane.position.set(0,-1,0)
plane.rotation.x=-Math.PI/2
plane.receiveShadow=true

//几何体
const sphere=new THREE.Mesh(
    new THREE.SphereGeometry(1),
    new THREE.MeshStandardMaterial({})
)
sphere.castShadow=true

//几何体辅助器
const axesHelper=new THREE.AxesHelper(5)

//环境光
// const amLight=new THREE.AmbientLight("#fff",0.2)

//点光源
const dotLight=new THREE.PointLight("#f16b8c",1,100)
dotLight.position.set(3,3,3,)
dotLight.castShadow=true
dotLight.shadow.radius=20;
dotLight.shadow.mapSize.set(2048, 2048);
dotLight.decay=2

//光源辅助器
const pointLightHelper =new THREE.PointLightHelper(dotLight,1)
//小球
const smallBall=new THREE.Mesh(
    new THREE.SphereGeometry(0.1,20,20),
    new THREE.MeshBasicMaterial({color:"#f00"})
)
smallBall.position.set(3,3,3,)

//gui
const gui=new Dat.GUI
gui.add(dotLight,"decay").min(0).max(5).step(0.1)

//渲染器
const renderer=new THREE.WebGLRenderer()
renderer.shadowMap.enabled=true
document.body.appendChild(renderer.domElement)
//控制器
const control=new OrbitControls(camara,renderer.domElement)
scene.add(plane)
scene.add(sphere)
// scene.add(amLight)
smallBall.add(dotLight)
// scene.add(dotLight)
scene.add(smallBall)
scene.add(axesHelper)
// scene.add(pointLightHelper)

//时钟
const clock=new THREE.Clock()

//渲染函数
const render=()=>{
    let time= clock.getElapsedTime()
    smallBall.position.x=Math.sin(time)*3;
    smallBall.position.z=Math.cos(time)*3;
    renderer.render(scene,camara)
    control.update()
    camara.updateProjectionMatrix()
    renderer.shadowMap.enabled=true
    // renderer.setPixelRatio(window.innerWidth,window.innerHeight)
    renderer.setSize(window.innerWidth,window.innerHeight)
    requestAnimationFrame(render)
}

render()

</script>
<style  scoped>
.a{
    background: #f16b8c;
}
</style>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Three.js中,要实现一个跟随鼠标位置移动点光源,可以按照以下步骤进行: 1. 创建一个点光源 要创建一个点光源,可以使用Three.js提供的PointLight类。例如: ```javascript const pointLight = new THREE.PointLight(0xffffff, 1, 100); scene.add(pointLight); ``` 这里创建了一个颜色为白色、强度为1、距离为100的点光源,并将其添加到场景中。 2. 监听鼠标移动事件 要让点光源跟随鼠标位置移动,需要监听鼠标移动事件。可以使用JavaScript的addEventListener方法,监听mousemove事件。例如: ```javascript document.addEventListener('mousemove', onDocumentMouseMove); ``` 这里定义了一个名为onDocumentMouseMove的函数,它将在鼠标移动时被调用。 3. 在鼠标移动事件中更新点光源位置 在onDocumentMouseMove函数中,可以获取鼠标位置,并将点光源位置设置为鼠标位置的三维坐标。例如: ```javascript function onDocumentMouseMove(event) { const mouseX = event.clientX; const mouseY = event.clientY; const vector = new THREE.Vector3( (mouseX / window.innerWidth) * 2 - 1, -(mouseY / window.innerHeight) * 2 + 1, 0.5 ); vector.unproject(camera); const dir = vector.sub(camera.position).normalize(); const distance = -camera.position.z / dir.z; const pos = camera.position.clone().add(dir.multiplyScalar(distance)); pointLight.position.copy(pos); } ``` 这里使用了Three.js提供的Vector3类来计算鼠标位置对应的三维坐标。具体的计算方法可以参考Three.js的官方文档。最后,将点光源位置设置为计算得到的位置。 通过以上步骤,就可以实现一个跟随鼠标位置移动点光源了。完整的代码可以参考下面的示例: ```javascript let camera, scene, renderer, pointLight; init(); animate(); function init() { camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 0.1, 1000); camera.position.z = 5; scene = new THREE.Scene(); const geometry = new THREE.BoxGeometry(); const material = new THREE.MeshPhongMaterial({ color: 0x00ff00 }); const mesh = new THREE.Mesh(geometry, material); scene.add(mesh); pointLight = new THREE.PointLight(0xffffff, 1, 100); scene.add(pointLight); renderer = new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); document.addEventListener('mousemove', onDocumentMouseMove); } function animate() { requestAnimationFrame(animate); renderer.render(scene, camera); } function onDocumentMouseMove(event) { const mouseX = event.clientX; const mouseY = event.clientY; const vector = new THREE.Vector3( (mouseX / window.innerWidth) * 2 - 1, -(mouseY / window.innerHeight) * 2 + 1, 0.5 ); vector.unproject(camera); const dir = vector.sub(camera.position).normalize(); const distance = -camera.position.z / dir.z; const pos = camera.position.clone().add(dir.multiplyScalar(distance)); pointLight.position.copy(pos); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值