星系模拟:更改点的颜色并在鼠标悬停时显示文本

2024-04-18

我正在尝试创建模拟 https://riteshsingh.github.io/galaxies/4673 个最近星系的位置。

星系是点。

我想为鼠标悬停时的点着色并加载星系的名称。

我花了很多天试图实现它。我可以更改颜色以及进行基本的光线投射,但是,我无法单独对单个点进行光线投射/颜色。所有点都作为一个组进行光线投射和着色,如图所示当前版本 https://riteshsingh.github.io/galaxies/.

我应该做什么来纠正这个问题?非常感谢您对初学者的时间和耐心。

完整代码可用here https://github.com/RiteshSingh/galaxies/blob/master/index.htm.

相关代码如下:

window.addEventListener( "mousemove", onDocumentMouseMove, false );

var selectedObject = null;

function onDocumentMouseMove( event ) {

    event.preventDefault();
    if ( selectedObject ) {

        selectedObject.material.color.set( '#fff' );
        selectedObject = null;

    }

    var intersects = getIntersects( event.layerX, event.layerY );
    if ( intersects.length > 0 ) {

        var res = intersects.filter( function ( res ) {

            return res && res.object;

        } )[ 0 ];

        if ( res && res.object ) {

            selectedObject = res.object;
            selectedObject.material.color.set( '#69f' );

        }

    }

}

var raycaster = new THREE.Raycaster();
var mouseVector = new THREE.Vector3();

function getIntersects( x, y ) {

    x = ( x / window.innerWidth ) * 2 - 1;
    y = - ( y / window.innerHeight ) * 2 + 1;

    mouseVector.set( x, y, 0.5 );
    raycaster.setFromCamera( mouseVector, camera );

    return raycaster.intersectObject( dots, true );

}

首先要做的是设置raycaster.params.Points.threshold等于你的点的大小。这使得当用户将鼠标悬停在任何点上时,所有点的颜色都会发生变化:

(为了便于悬停,我增加了点大小):

<html>
<head>
  <meta charset="UTF-8">
  <style>
    body { margin: 0; }
  </style>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/110/three.min.js"></script>
  <script src="https://rawcdn.githack.com/mrdoob/three.js/f32e6f14046b5affabe35a0f42f0cad7b5f2470e/examples/js/controls/TrackballControls.js"></script>
</head>

<body>
<script>

// Create an empty scene
var scene = new THREE.Scene();

// Create a basic perspective camera
var camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.1, 1000 );
camera.position.x = 200;

// Create a renderer with Antialiasing
var renderer = new THREE.WebGLRenderer({antialias:true});

// Configure renderer clear color
renderer.setClearColor("#000000");

// Configure renderer size
renderer.setSize( window.innerWidth, window.innerHeight );

// Append Renderer to DOM
document.body.appendChild( renderer.domElement );

//Add Milky Way
var dotGeometry = new THREE.Geometry();
dotGeometry.vertices.push(new THREE.Vector3( 0, 0, 0));

var rawFile = new XMLHttpRequest();
rawFile.open("GET", "https://rawcdn.githack.com/RiteshSingh/galaxies/9e6a4e54b37647e5a9a1d6f16c017769533fe258/galaxydata.txt", false);
rawFile.onreadystatechange = function ()
{
	if(rawFile.readyState === 4)
	{
		if(rawFile.status === 200 || rawFile.status == 0)
		{
			var allText = rawFile.responseText;
			var data = allText.split("\n");

			for (var i = 0; i < 4672; i++) {
				var parts = data[i].split("\t");

				var D = parts[0];
				var glon = parts[1]*3.1416/180;
				var glat = parts[2]*3.1416/180;

				var z = D*Math.sin(glat);
				var xy = D*Math.cos(glat);
				var x = xy*Math.cos(glon);
				var y = xy*Math.sin(glon);

				dotGeometry.vertices.push(new THREE.Vector3( x, y, z));
			}
		}
	}
}
rawFile.send(null);

var size = 0.32;
var dotMaterial = new THREE.PointsMaterial( { size: size } );
var dots = new THREE.Points( dotGeometry, dotMaterial );
scene.add( dots );

var controls = new THREE.TrackballControls( camera, renderer.domElement );

// Render Loop
var render = function () {
  requestAnimationFrame( render );
  controls.update();
  // Render the scene
  renderer.render(scene, camera);
};
render();

window.addEventListener( "mousemove", onDocumentMouseMove, false );

var selectedObject = null;

function onDocumentMouseMove( event ) {

	event.preventDefault();
	if ( selectedObject ) {

		selectedObject.material.color.set( '#fff' );
		selectedObject = null;

	}

	var intersects = getIntersects( event.layerX, event.layerY );
	if ( intersects.length > 0 ) {

		var res = intersects.filter( function ( res ) {

			return res && res.object;

		} )[ 0 ];

		if ( res && res.object ) {

			selectedObject = res.object;
			selectedObject.material.color.set( '#69f' );

		}

	}

}

var raycaster = new THREE.Raycaster();
raycaster.params.Points.threshold = size;
var mouseVector = new THREE.Vector3();

function getIntersects( x, y ) {

	x = ( x / window.innerWidth ) * 2 - 1;
	y = - ( y / window.innerHeight ) * 2 + 1;

	mouseVector.set( x, y, 0.5 );
	raycaster.setFromCamera( mouseVector, camera );

	return raycaster.intersectObject( dots, true );

}

</script>
</body>
</html>

然后你只需要做到只有悬停点改变颜色:

<html>
<head>
  <meta charset="UTF-8">
  <style>
    body { margin: 0; }
  </style>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/110/three.min.js"></script>
  <script src="https://rawcdn.githack.com/mrdoob/three.js/f32e6f14046b5affabe35a0f42f0cad7b5f2470e/examples/js/controls/TrackballControls.js"></script></script>
</head>

<body>
<script>

// Create an empty scene
var scene = new THREE.Scene();

// Create a basic perspective camera
var camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.1, 1000 );
camera.position.x = 200;

// Create a renderer with Antialiasing
var renderer = new THREE.WebGLRenderer({antialias:true});

// Configure renderer clear color
renderer.setClearColor("#000000");

// Configure renderer size
renderer.setSize( window.innerWidth, window.innerHeight );

// Append Renderer to DOM
document.body.appendChild( renderer.domElement );

//Add Milky Way
var dotGeometry = new THREE.Geometry();
dotGeometry.vertices.push();

var colors = [];

var rawFile = new XMLHttpRequest();
rawFile.open("GET", "https://rawcdn.githack.com/RiteshSingh/galaxies/9e6a4e54b37647e5a9a1d6f16c017769533fe258/galaxydata.txt", false);
rawFile.onreadystatechange = function ()
{
	if(rawFile.readyState === 4)
	{
		if(rawFile.status === 200 || rawFile.status == 0)
		{
			var allText = rawFile.responseText;
			var data = allText.split("\n");

			for (var i = 0; i < 4672; i++) {
				var parts = data[i].split("\t");

				var D = parts[0];
				var glon = parts[1]*3.1416/180;
				var glat = parts[2]*3.1416/180;

				var z = D*Math.sin(glat);
				var xy = D*Math.cos(glat);
				var x = xy*Math.cos(glon);
				var y = xy*Math.sin(glon);

				dotGeometry.vertices.push(new THREE.Vector3( x, y, z));

				colors.push(new THREE.Color(0xFF0000));
			}
		}
	}
}
rawFile.send(null);

dotGeometry.colors = colors;

var size = 0.32;
var dotMaterial = new THREE.PointsMaterial({
	size: size,
	vertexColors: THREE.VertexColors,
});
var dots = new THREE.Points( dotGeometry, dotMaterial );
scene.add( dots );

var controls = new THREE.TrackballControls( camera, renderer.domElement );

// Render Loop
var render = function () {
  requestAnimationFrame( render );
  controls.update();
  // Render the scene
  renderer.render(scene, camera);
};
render();

window.addEventListener( "mousemove", onDocumentMouseMove, false );

var selectedObject = null;

function onDocumentMouseMove( event ) {

	event.preventDefault();
	if ( selectedObject ) {

		selectedObject.material.color.set( '#fff' );
		selectedObject = null;

	}

	var intersects = getIntersects( event.layerX, event.layerY );
	if ( intersects.length > 0 ) {
		var idx = intersects[0].index;
		dots.geometry.colors[idx] = new THREE.Color(0xFFFFFF);
		dots.geometry.colorsNeedUpdate = true;
		console.log(idx)
	}
}

var raycaster = new THREE.Raycaster();
raycaster.params.Points.threshold = size;
var mouseVector = new THREE.Vector3();

function getIntersects( x, y ) {

	x = ( x / window.innerWidth ) * 2 - 1;
	y = - ( y / window.innerHeight ) * 2 + 1;

	mouseVector.set( x, y, 0.5 );
	raycaster.setFromCamera( mouseVector, camera );

	return raycaster.intersectObject( dots, true );

}

</script>
</body>
</html>

当用户将鼠标悬停在这些点上后,您会看到这些点变成白色。

我将把它作为教学练习,让您确定如何在鼠标退出给定点后将点变回红色:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

星系模拟:更改点的颜色并在鼠标悬停时显示文本 的相关文章

  • ES6 Promise.all 进度

    在进一步行动之前 我有几个需要解决的承诺 Promise all promises then results gt going further 有什么办法可以让我取得进展吗 Promise all承诺 从文档看来 这不可能 https de
  • Webpack 编译的 Chrome 扩展抛出 `unsafe-eval` 错误

    使用 Webpack 编译后重新加载 Chrome 扩展时出现此错误 Uncaught EvalError Refused to evaluate a string as JavaScript because unsafe eval is
  • 如何过滤javascript对象数组

    我有两个数组 我正在使用 PubSidebar 过滤基于 groupKey 的内容 let groupKey oaDeal Journals Deposit This array of object will be filtering wi
  • Nodemon - 使用配置文件指定扩展监视列表

    有没有办法使用配置文件而不是命令行来指定监视列表 Nodemon 文档中的命令行方法 我尝试使用nodemon json配置文件包含以下内容 ext js json hbs html 返回 扩展名匹配 错误 然后我尝试将配置添加到packa
  • React-Native 博览会 POST Blob

    我正在使用 React Native 和 expo 并尝试通过 fetch api 发布 blob 图像 我对正文使用表单数据格式 并且我有下一个代码 const blob await response blob const form ne
  • 在 IOS9 中的 Cordova 应用程序上使用 JQuery/Javascript 的 window.history 问题

    我在 IOS9 测试版 下使用 Cordova 应用程序时遇到问题 我正在使用最新的 Cordova 和 JQuery 移动版本 window history 未更新 导致以下故障 window history go 1 无法返回页面 即使
  • 在 javascript/jquery 中获取图像的完整尺寸

    我在页面上有一个图像 该图像已调整大小以适合 div 例如 400x300 如何在 jQuery 中获取图像的完整尺寸 4000x3000 width 和 height 似乎只返回图像的当前大小 图像有naturalWidth and na
  • 检索博客中所有标签的列表

    有没有办法使用 gdata api 检索所有列表labels在博主中 我需要根据该列表创建一个菜单 但不能简单地列出所有帖子并获取它 因为它是一个繁忙的博客 并且有超过 2000 个帖子 以下是使用 json 调用获取标签列表的最简单方法
  • 如何在前端和后端之间共享javascript代码(ES6)

    这是 ES6 特定的副本这个所以线程 https stackoverflow com questions 3225251 how can i share code between node js and the browser 其中详细介绍
  • 未捕获的类型错误:属性...不是函数 - 页面加载后

    我正在使用对外部 API 的跨域 Ajax 请求 有时它会失败 并显示控制台消息 Uncaught TypeError Property photos of object object DOMWindow is not a function
  • 页面刷新后如何注销用户?

    我正在跟进谷歌的指南 https developers google com identity sign in web sign in sign out a user注销用户 考虑到gapi auth2刷新页面后将是未定义的 我正在做 if
  • 如何字符串化整个 Javascript 对象(包括 __proto__ 属性)?

    如果这是重复的 我很抱歉 到目前为止我找不到相同的问题 我的对象中有一个具有各种方法的对象 proto 成员 我们称这个对象的类型为myObjectType 稍后我必须做一个JSON stringify myObjectType 问题是 当
  • 在 php 中进行 AES 加密,然后用 Javascript (cryptojs) 解密

    我正在寻找一种对简单文本 5 到 6 个数字和 或字符 进行双向加密的方法 问题是我想在 php 中进行加密 然后通过 Javascript 解密 对于 php 我已经使用 mcrypt encode 进行了测试并使其正常工作 因此当我尝试
  • PHP 中的 Javascript“unes​​cape”

    我的图像主机有一个 Google Chrome 扩展程序 它会向我的网站发送一个 URL 该网址得到encoded通过 JavaScript 的escape method 编码的 URLescape看起来像这样 http 253A 4 bp
  • 通过 JavaScript 获取页面/iframe 的编码

    我想通过 JavaScript 或浏览器中的其他一些 API 以编程方式确定页面的编码 我想要这些信息的原因是因为我试图对主要浏览器支持的字符编码进行模糊测试 显然仅仅因为我发送了适当的 内容类型 并不意味着浏览器会使用编码做正确的事情 欢
  • 散景服务器获取鼠标位置

    我正在开发一个带有散景 0 12 2 的交互式应用程序 它根据特定的交互更新绘图 现在 我使用滑块来更改图中字形的位置 但实际上我想访问鼠标在特定图中的位置 数据集是一个多维矩阵 张量 密集数据 每个图在特定位置显示一个维度 如果我更改一个
  • 获取 Html.TextBoxFor 字段的 HTML id

    有没有办法在 Javascript 中获取 ASP NET MVC 控件生成的客户端 ID Html TextBoxFor m gt m Name 像这样 Html IdFor m gt m Name
  • 所有人共享的 First Load JS 在 next.js 中相当重

    I have a project on Next js framework and the problem is that First Load JS shared by all pages is rather heavy I want t
  • Sencha-touch :保存登录名/密码(保存会话,多任务)

    我有一个 Java Web 应用程序 其中移动部分是用 Sencha touch 开发的 当我启动 sencha touch 应用程序时 她询问我的登录名 密码 因为该应用程序的访问受到限制 但是我想保存用户的登录名 密码 sencha t
  • 使用node.js/Express从HTTP重定向到HTTPS

    有什么方法可以更改我的 Web 应用程序以侦听 HTTPS 而不是 HTTP 我正在使用node js express 我需要它来侦听 HTTPS 因为我正在使用地理定位 而 Chrome 不再支持地理定位 除非从 HTTPS 等安全上下文

随机推荐

  • 如何在一个Web应用程序上下文中访问另一个Web应用程序上下文

    我在 Tomcat6 服务器中部署了两个 WAR 例如WAR A WAR B in Context A and Context B分别 我已经存储了一些数据Context A 我想读取该数据Context B 我已经通过网络找到了一些方法来
  • 绑定 Telerik RadTreeView 客户端

    我有一个 javascript 对象数组 我想用它来填充 RadTreeView 除了为我的对象集合手动编写自己的绑定方法之外 我不知道如何从客户端完成此操作 我的 javascript 数组中的每个对象都有 ID 父ID 价值 文本 有没
  • Django Rest Framework - 如何为所有 ModelSerializer 字段创建自定义错误消息?

    这是我的serializers py 我想为内置用户模型创建一个序列化器 from rest framework import serializers from django contrib auth models import User
  • Solidity有HTTP请求功能吗?

    我正在使用以太坊制作一个项目 在这个项目中 我正在签订一份名为 A 的合同 当我向 A 发送消息时 我希望 A 发出网络请求 Solidity 是否可以使用 http 请求 方法 GET POST 以太坊区块链无法与外界交互 否则它将不再是
  • 响应预期内容长度返回-1

    您好 当我从网络服务加载数据时 我需要创建一个进度视图 实际上预期的内容长度总是返回 1 在查看了很多相似问题之后 看起来我的网络服务从未发送内容长度 然后我检查 CURL 结果如下 lt HTTP 1 1 200 OK lt Date T
  • R Stargazer 报告系数、置信区间和精确 p 值

    我正在运行一个国家固定效应模型 进一步包括一个虚拟变量 我正在使用 Stargazer 包 但似乎无法弄清楚如何报告置信区间和确切的 p 值 如果我运行我的模型 stargazer dummy CPP title xx align TRUE
  • 我用带有垃圾收集器的语言构建了一个解释器。我需要一个用于解释器的垃圾收集器吗?

    这是一个幼稚的问题 但在我迄今为止看到的教程中并没有拼写清楚 如果我在一种高级语言 不是 C C 等 之上构建一个解释器 并且它有一个垃圾收集器 是否有必要为解释器本身制作一个 如果答案是肯定的 那一定是同一类宿主吧 即 如果主机是标记 清
  • android 上下文空指针异常

    我对 android Context 有一个小问题 我不知道如何解决这个问题 这是我正在使用的代码 public class TestActivity Context context public static String getPack
  • 在目录上运行 ng lint 时遇到问题

    我正在尝试使用 Angular 8 附带的 linter 但我有一段时间忽略了 TSLint 错误 我希望慢慢地清除错误 并且我正在寻找一种在整个目录上运行 linter 的方法 其中一些目录可能有多个子目录 我看过ng lint 的 An
  • Git Cherry-Pick 和冲突

    有两个不同的 git 分支 其中一个开发正在进行 Branch1 在其他分支中 一些 PoC 工作正在进行 Branch2 现在 我想挑选从 Branch1 到 Branch2 的更改 以便 Branch2 是最新的 现在 在挑选 4 或
  • 对于“未找到项目”错误页面,最合适的 HTTP 状态代码是什么

    我很好奇 项目不存在 页面最合适的 HTTP 状态代码是什么 如果页面本身不存在 我显然会使用 404 但是 我的其中一个页面有一个userid参数 它是一个 编辑用户 页面 如果不存在具有给定用户 ID 的用户 我将显示一个错误页面 但我
  • 谷歌合作实验室“ResourceExhaustedError”与 GPU

    我正在尝试微调Vgg16模型使用colaboratory但我在使用 GPU 训练时遇到了这个错误 OOM when allocating tensor of shape 7 7 512 4096 INFO tensorflow Error
  • 无空间分页库

    新分页库的所有示例都已包含在 Room 库中 Room 为我们创建了一个数据源 就我自己而言 我需要创建自定义数据源 这是我的视图模型类中的一个方法 它应该返回实时数据 我的 livedata 总是返回 null LiveData
  • Cakephp 递归条件下的分页

    我对这个问题很生气 请有人帮助我 我有这个模型 订单有很多 gt 订单项有一个 gt 产品 产品有字段vendor id 我想对包含具有特定供应商 ID 的产品的订单进行分页 我怎样才能实现这个目标 我在订单控制器中的代码 if empty
  • 转义 Django 模板变量的简单方法

    对于一个新项目 我们正在编写文档aboutDjango 模板系统 我们也将 Django 用于文档项目本身 因此 Django 会选取示例代码中的所有示例变量并尝试呈现它们 我们发现解决这个问题的唯一方法是使用 模板标签 http docs
  • 为什么 unique_ptr 不能从 T* 构造?

    举个简单的例子 这段代码有什么 问题 unique ptr
  • 使用 @Transactional 时自动装配依赖项的注入失败

    我测试了我的 DAO 但没有成功 出现以下错误 Tests in error testAccountOperations com tsekhan rssreader dao HibernateControllerTest Error cre
  • javax.activation.UnsupportedDataTypeException:没有 MIME 类型多部分/混合的对象 DCH;边界

    目前我正在编写一段监听目录的代码 当使用 apk 文件更新目录时 我会将包含此 apk 文件的邮件发送到 gmail 帐户 我在我的程序中使用 Jnotify 和 JAVA Mail 我得到的错误是 javax mail Messaging
  • 使用 jQuery 的 MediaWiki API 没有响应

    我尝试从 Wikipedia 获取一些 JSON 内容 getJSON http en wikipedia org w api php action query prop revisions rvprop content titles ti
  • 星系模拟:更改点的颜色并在鼠标悬停时显示文本

    我正在尝试创建模拟 https riteshsingh github io galaxies 4673 个最近星系的位置 星系是点 我想为鼠标悬停时的点着色并加载星系的名称 我花了很多天试图实现它 我可以更改颜色以及进行基本的光线投射 但是