Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >画布上方的三个js和react按钮

这是我在react中的three.js代码,我想在这个画布上添加按钮。我该怎么做??另外,我如何在我的对象上添加点击事件?

代码语言:javascript
运行
AI代码解释
复制
import React, { Component } from 'react'
    import * as THREE from 'three'
    //import Button from '@material-ui/core/Button';

    class Scene extends Component {
    constructor(props) {
    super(props)

    this.start = this.start.bind(this)
    this.stop = this.stop.bind(this)
    this.animate = this.animate.bind(this)
    }

    componentDidMount() {
    const sizes = {
        width : window.innerWidth,
        height : window.innerHeight
    }

    const scene = new THREE.Scene()

    window.addEventListener('resize', () =>
    {
    // Update sizes
    sizes.width = window.innerWidth
    sizes.height = window.innerHeight

    // Update camera
    camera.aspect = sizes.width / sizes.height
    camera.updateProjectionMatrix()

    // Update renderer
    renderer.setSize(sizes.width, sizes.height)
    renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2))
    })

    const renderer = new THREE.WebGLRenderer({ antialias: true })
    const geometry = new THREE.BoxGeometry(1, 1, 1, 10, 10, 10 );
    const particlesGeometry = new THREE.BufferGeometry();
    const particlesCnt = 8000;

    const posArray = new Float32Array(particlesCnt * 3);

    for (let i=0; i< particlesCnt *3; i++) {
    posArray[i] = (Math.random() - 0.5 ) *5
    }

    particlesGeometry.setAttribute('position', new THREE.BufferAttribute(posArray, 3));
    
    const material = new THREE.PointsMaterial({
        size: 0.005
    })

    // Texture Loader
    const loader = new THREE.TextureLoader()
    const star = loader.load('./star.png')
    const particlesMaterial = new THREE.PointsMaterial({
        size: 0.005,
        map: star,
        transparent: true,
        //color: 'blue'
        //bleding: THREE.AdditiveBlending
    })
    
    const cube = new THREE.Points(geometry, material)
    const particlesMesh = new THREE.Points(particlesGeometry, particlesMaterial);
    scene.add(cube, particlesMesh)

    const pointLight = new THREE.PointLight(0xffffff, 0.1)
    pointLight.position.x = 2
    pointLight.position.y = 3
    pointLight.position.z = 4
    scene.add(pointLight)

    //camera.position.z = 4
    // scene.add(cube)
    // renderer.setClearColor('#000000')

    
    const camera = new THREE.PerspectiveCamera(75, sizes.width /sizes.height, 0.1, 100)
    camera.position.x = 0
    camera.position.y = 0
    camera.position.z = 2
    scene.add(camera)

    renderer.setSize(sizes.width, sizes.height)

    this.scene = scene
    this.camera = camera
    this.renderer = renderer
    this.material = material
    this.cube = cube
    this.particlesMesh = particlesMesh

    this.mount.appendChild(this.renderer.domElement)
    this.start()
    }

    componentWillUnmount() {
    this.stop()
    this.mount.removeChild(this.renderer.domElement)
    }

    start() {
    if (!this.frameId) {
      this.frameId = requestAnimationFrame(this.animate)
    }
    }

    stop() {
    cancelAnimationFrame(this.frameId)
    }

    animate() {
    //this.cube.rotation.x += 0.01
    this.cube.rotation.y += 0.01
    this.particlesMesh.rotation.y += 0.01

    this.renderScene()
    this.frameId = window.requestAnimationFrame(this.animate)
    
    }

    renderScene() {
    this.renderer.render(this.scene, this.camera)
    }

    render() {
    return (
      <div
        style={{ width: '400px', height: '400px' }}
        ref={(mount) => { this.mount = mount }}
      >
          </div>
    )
    }
    }

    export default Scene

这是我在react中的three.js代码,我想在这个画布上添加按钮。我该怎么做??另外,我如何在我的对象上添加点击事件?

谢谢你的帮助!

EN

回答 1

Stack Overflow用户

发布于 2021-08-11 07:15:39

首先,我建议在使用react和three时,看看react-three/fiber和react-three/drei,以加快开发速度。

按钮问题:要让按钮出现,你应该看看你的样式。例如,您可以将按钮的位置设置为absolute,并将zIndex设置为大于画布的值。

例如:

代码语言:javascript
运行
AI代码解释
复制
<div style={{
 position: "absolute",
 top: "50%",
 left: "50%",
 zIndex: "10000"
}}>
 <Button >
</div>

单击事件问题:要监听3d对象上的单击事件,您必须实现Raycaster

然后,您将能够检查与场景中的对象的交点,并调用其他函数。

react-three/fiber已经为您实现了此功能,您可以调用:

代码语言:javascript
运行
AI代码解释
复制
<mesh
 onClick={(e) => // do something}>
</mesh>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68511359

复制
相关文章
Rust:从嵌套循环中退出
在C语言中,我们常用goto语句来在错误条件下跳转到函数的数据清理部分。这种用法的好处尤其体现在“错误发生在嵌套循环”的时候,我们不用每一层循环都加一个标志位,逐级退出。
灯珑LoGin
2022/11/16
1.4K0
如何从结果集中获得随机结果
全表扫描(Full table Scan) 全表扫描返回表中所有的记录。 执行全表扫描,Oracle读表中的所有记录,考查每一行是否满足WHERE条件。Oracle顺序的读分配给该表的每一个数据块,这样全表扫描能够受益于多块读. 每个数据块Oracle只读一次.
数据和云01
2018/09/10
1.6K0
while循环嵌套while循环
《代码大全》推荐先用伪代码来写框架,从最上层思考可以将抽象能力最大化,不会先陷入任何编程语言的实现细节中,通俗地说就是在蓝图层面解决问题。
不会飞的小鸟
2021/07/30
3.5K0
Python学习笔记:第2天while循
while循环是先判断给的条件是否为真,如果真则执行循环体中的while语句,否则跳出循环;执行循环体之后再次判断条件是否为真。
py3study
2020/01/19
4920
【Python】循环语句 ② ( while 嵌套循环 | 代码示例 - while 嵌套循环 )
while 嵌套循环 也是基于 空格缩进 , Python 中基于 空格缩进 判定代码逻辑的层次关系 ;
韩曙亮
2023/10/11
4220
【Python】循环语句 ② ( while 嵌套循环 | 代码示例 - while 嵌套循环 )
while、do...while、嵌套循环复习
        首先进行循环条件判断,如果为 true,则执行{ }里的语句,如果为 false,则直接执行while后的语句,不进入循环体。
zxmttkx
2022/12/02
1.3K0
while、do...while、嵌套循环复习
sql的嵌套查询_嵌套查询和嵌套结果的区别
SQL连接查询和嵌套查询详解 连接查询 若一个查询同时涉及两个或两个以上的表,则称之为连接查询。连接查询是数据库中最最要的查询,
全栈程序员站长
2022/09/22
4K0
sql的嵌套查询_嵌套查询和嵌套结果的区别
MySQL 嵌套查询_嵌套查询和嵌套结果的区别
where course.cno=sc.cno and course.cname=’数据库’ and grade>=80)[/code](3)查询计算机系最高成绩。
全栈程序员站长
2022/09/22
4.4K0
sql 嵌套while需要注意的问题
DECLARE @i INT ,@j INT SET @i=1 set @j=1 WHILE @i<4     BEGIN         PRINT 'satrt  i:'+CAST(@i AS varchar)     WHILE @j<4         BEGIN             PRINT 'j:'+CAST(@j AS varchar)             SET @j=@j+1         END     set @j=1     set @i=@i+1     END   你
跟着阿笨一起玩NET
2018/09/18
6940
循环中的异步&&循环中的闭包
foo函数下的index输出5,全局下的index不存在 现在我们把var 换为let
陌上寒
2019/04/02
1.6K0
循环中的异步&&循环中的闭包
Eclipse中java获得mysql的查询结果集
本文介绍了在Java中如何获取MySQL数据库的查询结果集,并对代码进行了详细的解释和注释。包括使用DriverManager类来加载数据库驱动、使用Connection对象创建与数据库的连接、使用Statement对象创建SQL语句、使用ResultSet对象获取查询结果集、使用next()方法遍历结果集、使用getXXX()方法获取结果集中的数据以及使用close()方法关闭数据库连接。
别先生
2017/12/29
4.9K0
Eclipse中java获得mysql的查询结果集
如何通过神经风格转换获得漂亮的结果
最近开始对使用机器学习生成中型个人资料图片感兴趣。深入到了神经风格转换领域。尽管NST在概念上很容易理解,但要生成高质量图像却出奇地困难。为了获得良好的结果,必须正确实施许多复杂的细节和未提及的技巧。在本文中,将深入研究神经风格转换,并详细研究这些技巧。
代码医生工作室
2020/04/14
1.5K0
如何通过神经风格转换获得漂亮的结果
MYSQL IN EXISTS LEFT JOIN 结果不同的问题?
随着问问题的同学越来越多,公众号内部私信回答问题已经很困难了,所以建立了一个群,关于各种数据库的问题都可以,目前主要是 POSTGRESQL, MYSQL ,MONGODB ,POLARDB ,REDIS 等,期待你的加入,加群请添加微信liuaustin3.
AustinDatabases
2023/02/28
1.8K0
MYSQL IN EXISTS LEFT JOIN 结果不同的问题?
从一个多层嵌套循环中直接跳出
Java中如何从一个多层嵌套循环中退出,例如下面,有两个循环,break只能退出一个for循环,不能直接跳过第二个for循环
硬核编程
2020/07/23
9260
11.4.6 集合嵌套查询与嵌套结果(结果集) -《SSM深入解析与项目实战》
项目中所有的源码都可以在此链接的仓库中找到:https://github.com/chenhaoxiang/uifuture-ssm
谙忆
2021/10/26
4820
4个方面详细讲解Python中while循环嵌套
故事梗概: 有一天你的女朋友她又生气了,让你说3遍“媳妇,我错了”,这个程序是不是循环即可?但是如果你女朋友说:还要刷今晚吃饭的碗,这个程序又该怎么写呢?
python自学网
2022/03/26
1.6K0
4个方面详细讲解Python中while循环嵌套
While 与 do while 的区别
Do while和while的区别就是do while不管条件是否成立,都至少执行一次。
算法与编程之美
2023/01/03
9890
如何在 Python 中将嵌套的 OrderedDict 转换为 Dict?
Python 是一种流行的编程语言,广泛用于各种应用程序,包括 Web 开发、数据科学和机器学习。它的简单性、灵活性和易用性使其成为所有级别开发人员的绝佳选择。使Python脱颖而出的功能之一是OrderedDict类,它是一个字典子类,可以记住插入项目的顺序。但是,在某些情况下,我们可能需要将嵌套的 OrderedDict 转换为常规字典,以便于进一步处理数据。
很酷的站长
2023/08/11
4980
如何在 Python 中将嵌套的 OrderedDict 转换为 Dict?
如何在提升编程能力的同时,获得些福利
开发者头条是一个聚合了有很多优秀的技术文章的网站。开发者头条上的 IO币 可以换取一些礼物。礼物有键盘、鼠标、图书等。
前端GoGoGo
2018/08/24
3440
点击加载更多

相似问题

使用空格设置帮助菜单的格式

118

控制argparse帮助参数列表的格式?

460

python argparse中的重新格式化帮助

20

Python argparse:预格式化的帮助文本?

20

限制Argparse帮助输出

16
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文