Threejs 拖动点

2023-11-29

我必须生成大量可以单独拖动的对象。此外,这些物体仅限于平面形状(例如矩形或圆形)。 起初,我使用简单的 CircleGeometries,将其放置在另一个几何图形(平面)内。拖动它们也很容易,但正如预期的那样,大约 200000 个它们的性能非常差。 然后我决定使用点/粒子系统。平面内的定位工作得很好,但我无法设法使粒子系统的各个点可拖动。我在 Threejs 文档中找到了交互式粒子示例,但仍然不知道如何将它们与拖动控件结合起来。 这是我用于创建粒子系统并用这些点填充平面的代码:

//Create a plane geometrie, that is later filled with points
var geometry2 = new THREE.CircleGeometry(30,32);
var material2 = new THREE.MeshBasicMaterial( {color: 0x666666, side: THREE.DoubleSide, wireframe:true} );
var mat1 = new THREE.MeshBasicMaterial( {color: 0x00ff00, wireframe:false} );
var plane1 = new THREE.Mesh(geometry2, material2);
geometries.push(plane1);    //push to object for draggable elements
scene.add(plane1);        

var positionsX;

       positionsX = inGeometry.inGeometry(plane1.geometry,  200000); // get positions for points inside plane1

      var geometry = new THREE.Geometry();
      for (var i = 0; i < positionsX.length; i++) {
                geometry.vertices.push(positionsX[i]);  //add positions to vertices

      }
      console.log(geometry);

      //Create Particle system
      var material = new THREE.PointsMaterial({ size:0.02, color: 0xffffff });
      particleSystem = new THREE.Points(geometry, material);
      scene.add(particleSystem);
      console.log(particleSystem);


  var dragGeo = new DragControls(geometries, camera, container); //dragging

有人可以帮忙吗? 谢谢


enter image description here

只是一个如何拖动点的粗略示例:

var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 1, 1000);
camera.position.set(1.25, 7, 7);
camera.lookAt(scene.position);
var renderer = new THREE.WebGLRenderer({
  antialias: true
});
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

var geometry = new THREE.PlaneBufferGeometry(10, 10, 10, 10);
geometry.rotateX(-Math.PI * 0.5);

var plane = new THREE.Mesh(geometry, new THREE.MeshBasicMaterial({
  wireframe: true,
  color: "red"
}));
scene.add(plane);

var points = new THREE.Points(geometry, new THREE.PointsMaterial({
  size: 0.25,
  color: "yellow"
}));
scene.add(points);

var raycaster = new THREE.Raycaster();
raycaster.params.Points.threshold = 0.25;
var mouse = new THREE.Vector2();
var intersects = null;
var plane = new THREE.Plane();
var planeNormal = new THREE.Vector3();
var currentIndex = null;
var planePoint = new THREE.Vector3();
var dragging = false;

window.addEventListener("mousedown", mouseDown, false);
window.addEventListener("mousemove", mouseMove, false);
window.addEventListener("mouseup", mouseUp, false);

function mouseDown(event) {
  setRaycaster(event);
  getIndex();
  dragging = true;
}

function mouseMove(event) {
  if (dragging && currentIndex !== null) {
    setRaycaster(event);
    raycaster.ray.intersectPlane(plane, planePoint);
    geometry.attributes.position.setXYZ(currentIndex, planePoint.x, planePoint.y, planePoint.z);
    geometry.attributes.position.needsUpdate = true;
  }
}

function mouseUp(event) {
  dragging = false;
  currentIndex = null;
}

function getIndex() {
  intersects = raycaster.intersectObject(points);
  if (intersects.length === 0) {
    currentIndex = null;
    return;
  }
  currentIndex = intersects[0].index;
  setPlane(intersects[0].point);
}

function setPlane(point) {
  planeNormal.subVectors(camera.position, point).normalize();
  plane.setFromNormalAndCoplanarPoint(planeNormal, point);
}

function setRaycaster(event) {
  getMouse(event);
  raycaster.setFromCamera(mouse, camera);
}

function getMouse(event) {
  mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
  mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;
}

render();

function render() {
  requestAnimationFrame(render);
  renderer.render(scene, camera);
}
body {
  overflow: hidden;
  margin: 0;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/91/three.min.js"></script>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Threejs 拖动点 的相关文章

  • dojo dijit.form.DateTextBox 约束不起作用,datetextbox

    嗨 我是 javascript 和 dojo 的新手 我正在尝试使用两个带有下拉日历的 dijit DateTextBox 来建立数据库查询的日期范围 一旦选择了开始日期或结束日期 我想限制可用的日期 以便不可能选择按时间顺序排列在开始日期
  • 如何检测浏览器是否支持自定义元素

    我正在查看 Modernizr 它应该有助于功能检测 这应该可以帮助确定您的网站是否与给定的 Web 浏览器兼容 但我没有看到任何表明我可以使用它来检测自定义 HTML 的内容我们在内容中创建和定义的元素 如果不是 Modernizr 我如
  • 每 3 秒重复一次动画

    我正在使用 WOW js 和 animate css 现在我正在将 CSS 运行到 Infinite 我想知道如何让我的课程运行 3 秒停止并再次开始到无限 My html img src images fork png class for
  • 解析“流”JSON

    我在浏览器中有一个网格 我想通过 JSON 将数据行发送到网格 但浏览器应该在接收到 JSON 时不断解析它 并在解析时将行添加到网格中 换句话说 在接收到整个 JSON 对象后 不应将行全部添加到网格中 应该在接收到行时将其添加到网格中
  • 使用 useReducers 调度函数发送多个操作?

    使用时是否可以通过调度函数发送多个动作useReducer挂钩反应 我尝试向它传递一组操作 但这会引发未处理的运行时异常 明确地说 通常会有一个初始状态对象和一个减速器 如下所示 const initialState message1 nu
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • 使用 JavaScript 使链接保持活动状态并在单击时显示悬停效果

    I am struggling to make this work I d like to make it where if O F is clicked the hover state stays active if another li
  • 检查 JavaScript 字符串是否为 URL

    JavaScript 有没有办法检查字符串是否是 URL 正则表达式被排除在外 因为 URL 很可能是这样写的stackoverflow 也就是说它可能没有 com www or http 如果你想检查一个字符串是否是有效的 HTTP UR
  • 如何监听 jQuery AJAX 请求?

    以下两种实现 ajaxRequest 1 2 的方法应该是等效的 话说回来 为什么验证回调已执行的单元测试 3 在 1 中成功而在 2 中失败 我应该如何重写测试 3 来监视 2 中的成功回调 如果我尝试stub jQuery ajax使用
  • Javascript正则表达式用于字母字符和空格? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我需要一个
  • 从未用 @flow 标记的导入文件中获取类型定义

    TL DR我怎么告诉flow从未声明的导入模块导入类型定义 flow 加长版 流接缝能够从不使用流语法的文件中派生类型 请参阅示例 示例文件 flow js if Math random lt 0 5 var y hello else va
  • 标签获取 href 值

    我有以下 html div class threeimages a img alt Australia src Images Services 20button tcm7 9688 gif a div class text h2 a hre
  • JavaScript 重定向到新窗口

    我有以下代码 它根据下拉列表的值重定向到页面 我如何使其在新窗口中打开 function goto form var index form select selectedIndex if form select options index
  • 音频 blob 的 URL.createObjectURL 在 Firefox 中给出 TypeError

    我正在尝试从创建的音频 blob 创建对象 URLgetUserMedia 该代码在 Chrome 中可以运行 但在 Firefox 中存在问题 错误 当我打电话时stopAudioRecorder 它停在audio player src
  • 在javascript中解析json - 长数字被四舍五入

    我需要解析一个包含长数字的 json 在 java servlet 中生成 问题是长数字被四舍五入 当执行这段代码时 var s x 6855337641038665531 var obj JSON parse s alert obj x
  • Angular 2+ 安全性;保护服务器上的延迟加载模块

    我有一个 Angular 2 应用程序 用户可以在其中输入个人数据 该数据在应用程序的另一部分进行分析 该部分仅适用于具有特定权限的人员 问题是我们不想让未经授权的人知道how我们正在分析这些数据 因此 如果他们能够在应用程序中查看模板 那
  • 有没有办法阻止 prettier / prettier-now 将函数参数分解为新行

    当使用 prettier prettier now 在保存时进行格式化时 当一个函数包装另一个函数时 它会中断到一个新行 我想知道是否有办法阻止这种行为 例如 期望的输出 app get campgrounds id catchAsync
  • Safari 支持 JavaScript window.onerror 吗?

    我有一个附加到 window onerror 的函数 window onerror function errorMsg url line window alert asdf 这在 firefox chrome 和 IE 中工作正常 但在 s
  • 如何在 pg-promise 中设置模式

    我正在搜索的文档pg 承诺 https github com vitaly t pg promise特别是在创建客户端时 但我无法找到设置连接中使用的默认架构的选项 它始终使用public架构 我该如何设置 通常 为数据库或角色设置默认架构
  • 导致回发到与弹出窗口不同的页面

    我有一个主页和一个详细信息页面 详细信息页面是从主页调用的 JavaScript 弹出窗口 当单击详细信息页面上的 保存 按钮时 我希望主页 刷新 是否有一种方法可以调用主页的回发 同时还可以从详细信息页面维护保存回发 Edit 使用win

随机推荐

  • 如何使用循环来抓取 R 中多个网页的网站数据?

    我想应用一个循环来从 R 中的多个网页中抓取数据 我能够抓取一个网页的数据 但是当我尝试对多个页面使用循环时 我收到了一个令人沮丧的错误 我花了几个小时修修补补 但无济于事 任何帮助将不胜感激 这有效 GET COUNTRY DATA li
  • 数据帧 R 中的成对减法

    我有一个包含 576 行和 5 列的数据框 如下所示 Sample Value1 Value2 A 23 2 NA A 21 5 23 5 A 22 4 22 56 B 20 56 26 54 B 21 5 25 3 B 22 3 24 6
  • 替换 snprintf(3) 的 C++ 习惯用法是什么?

    我有一些 C 代码 在解析某个文件头失败时需要生成错误消息 在这种情况下 我需要确保标头中的某个 4 字节字段是 OggS 如果不是 则返回一条错误消息 例如 invalid capture pattern FooB waiting Ogg
  • jQuery: text() 和 html() 之间有什么区别?

    jQuery 中的 text 和 html 函数有什么区别 div html a href example html Link a b hello b vs div text a href example html Link a b hel
  • 转换unicode

    我有一个UITextField输入一个unicode值 当我点击UIButton需要将其转换并显示在UILabel 下面的代码对我来说工作正常 我的代码中的unicode NSString str NSString stringWithUT
  • 范围解析运算符和常量

    我们来看下面的代码 include
  • 类型擦除类型擦除,“有什么”问题吗?

    所以 假设我想使用类型擦除来键入擦除 我可以为变体创建伪方法 以实现自然的 pseudo method print auto self auto os os lt lt self std variant
  • 删除多维数组

    在 C FAQ 中 16 16 给出了以下示例 void manipulateArray unsigned nrows unsigned ncols typedef Fred FredPtr FredPtr matrix new FredP
  • MVC3 和 Code First 迁移 - “自数据库创建以来,支持‘blah’上下文的模型已发生变化”

    我使用 Entity Framework Code First 开始我的项目 当我准备好后 我将数据库和代码上传到我的主机提供商 一切顺利 我需要向我的一个类添加一个新字段 并且我不想丢失数据库中的数据 因此 我尝试关注一些有关使用 Cod
  • 如何使用 jQuery 更改元素的同级文本而不更改 html?

    我试图仅替换文本 但不触及任何其他标签 p a href login php i class fa fa sign in i Login a p p each function this text this text replace Log
  • 无法使用 MRTK v2.0.0-RC1 进行构建

    我曾尝试在 Unity 2018 3 10f1 上构建新 MRTK 版本 2 0 0 RC1 的场景示例 但每次每个示例都会出现构建错误 其中显示 找不到类型或命名空间名称 HandJointKind 您是否缺少 using 指令或程序集引
  • 在Python中,我可以调用导入模块的main()吗?

    在Python中我有一个modulemyModule py 我在其中定义了一些函数和一个main 它需要一些命令行参数 我通常从 bash 脚本中调用这个 main 现在 我想把一切都放进一个小package 所以我想也许我可以将我的简单b
  • 日期时间到数字以及向后转换

    R 中的日期 时间我有这个日期 2016 10 29 15 00 00 我想将其转换为数字并向后转换为我的相同日期和时间 我用它来将其转换为数字 as numeric as POSIXct 2016 10 29 15 00 00 我怎样才能
  • 如何在pyspark中使用多行选项将数据帧保存到json文件中

    在 Pyspark 中 我想将数据帧保存为 json 文件 但格式如下 说这是我的数据框 gt gt gt rdd1 show f1 f2 AAAAAAAAAA 99999 BBBBBBBBB 99999 CCCCCCCCC 99999 如
  • 在 FirebaseDatabase.getReference() 中获取 NPE

    我在应用程序启动时在生产版本中获得 NPE 并且在使用 adb 重新安装后仅获得一次 NPE Caused by java lang NullPointerException Attempt to invoke interface meth
  • 使用 DecorlatedJitterBackoff 的最大重试次数

    我正在使用 polly DecorlatedJitterBackoff 策略来重试 http 请求 我的用例是 当 timeSpan 达到 300 秒时 它应该每 300 秒重试 int maximum 次数 我正在尝试使用以下代码来实现此
  • 将 JPanel 中的 JLabel 定位在图像下方

    我想将给定示例中的文本移动到图像和形状下方 请帮我做一下 package test import java awt BasicStroke import java awt Graphics import java awt Graphics2
  • RestSharp 身份验证器遵循 302 重定向

    我正在尝试使用 RestSharp 向 API 发出请求 通过将请求重定向到登录服务器 使用基本凭据进行身份验证 获取 cookie 然后重定向回 API 来保护此 API 恐怕我无法控制这个 所以请求的顺序是 Request Respon
  • Swift:使用 WKWebView 的 createPdf 创建 pdf

    Edit 在找到问题 2 的解决方案后 并且给人的印象是问题 1 没有简单的 开箱即用的解决方案 我决定关闭这个问题 而专门针对分页问题创建另一个问题 我有两个问题WKWebViews createPDF configuration com
  • Threejs 拖动点

    我必须生成大量可以单独拖动的对象 此外 这些物体仅限于平面形状 例如矩形或圆形 起初 我使用简单的 CircleGeometries 将其放置在另一个几何图形 平面 内 拖动它们也很容易 但正如预期的那样 大约 200000 个它们的性能非