正交相机并通过光线投射选择对象

2023-12-30

我在使用光线投射器使用正交相机选择对象时遇到了一些困难。不过,当我使用透视相机时,我没有任何问题。在两者之间切换时,我唯一要改变的是相机类型。

我可以在正交视图上选择面,但它仅与我在屏幕上单击的位置松散相关。当我可以在远离物体的地方点击时,它仍然会回来,就好像它击中了物体中心附近一样。

关于我在这里缺少什么有什么想法吗?

我的大部分代码都基于此example http://stemkoski.github.io/Three.js/Mouse-Click.html,并且我希望从我的代码中获得非常相似的结果。 (我引用的这个例子使用透视相机)

任何帮助深表感谢

<html>
<head>
  <style>
    canvas {
      left: 0;
      top: 0;
      width: 100%;
      height: 100%;
      position: fixed;
      background-color: #111115;
    }
  </style>
</head>
<body id='c'>
  <script src="js/three.js"></script>

  <script>

    var obj = [];
    var mouse ={};
    var zoom = 2;

    var scene = new THREE.Scene();

    //switch between these two and see the difference:
    //var camera =  new THREE.OrthographicCamera(window.innerWidth / -zoom, window.innerWidth / zoom, window.innerHeight / zoom, window.innerHeight / -zoom, -1000, 1000);
    var camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 1000 );

    camera.position = new THREE.Vector3(100,100,100);
    camera.lookAt(new THREE.Vector3(0,0,0));

    // this material causes a mesh to use colors assigned to faces
    var material = new THREE.MeshBasicMaterial( 
    { color: 0xffffff, vertexColors: THREE.FaceColors } );

    var sphereGeometry = new THREE.SphereGeometry( 80, 32, 16 );
    for ( var i = 0; i < sphereGeometry.faces.length; i++ ) 
    {
      face = sphereGeometry.faces[ i ]; 
      face.color.setRGB( 0, 0, 0.8 * Math.random() + 0.2 );     
    }
    obj['box'] = {};
    obj['box'] = new THREE.Mesh( sphereGeometry, material );
    obj['box'].castShadow = true;
    obj['box'].receiveShadow = true;
    scene.add(obj['box']);

    var ambientLight = new THREE.AmbientLight(0xbbbbbb);
    scene.add(ambientLight);

    var directionalLight = new THREE.DirectionalLight(0xffffff, 1);
    directionalLight.position.set(-100, 40, 100);
    directionalLight.castShadow = true;
    directionalLight.shadowOnly = true;
    directionalLight.shadowDarkness = .5;
    scene.add(directionalLight); 

    var renderer = new THREE.WebGLRenderer();
    renderer.setSize(window.innerWidth, window.innerHeight);
    renderer.shadowMapEnabled = true;
    renderer.shadowMapSoft = true;
    document.body.appendChild(renderer.domElement);

    projector = new THREE.Projector();
    document.addEventListener( 'mousedown', onDocumentMouseDown, false );
    function onDocumentMouseDown( event ) {
      // the following line would stop any other event handler from firing
      // (such as the mouse's TrackballControls)
      // event.preventDefault();

      console.log("Click.");

      // update the mouse variable
      mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
      mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;

      // find intersections

      // create a Ray with origin at the mouse position
      //   and direction into the scene (camera direction)
      var vector = new THREE.Vector3( mouse.x, mouse.y, 1 );
      projector.unprojectVector( vector, camera );
      var ray = new THREE.Raycaster( camera.position, vector.sub( camera.position ).normalize() );

      // create an array containing all objects in the scene with which the ray intersects
      var intersects = ray.intersectObjects( [obj['box']] );

      // if there is one (or more) intersections
      if ( intersects.length > 0 )
      {
        console.log("Hit @ " + toString( intersects[0].point ) );
        console.log(intersects);
        // change the color of the closest face.
        intersects[ 0 ].face.color.setRGB( 0.8 * Math.random() + 0.2, 0, 0 ); 
        intersects[ 0 ].object.geometry.colorsNeedUpdate = true;
      }
    }

    function toString(v) { return "[ " + v.x + ", " + v.y + ", " + v.z + " ]"; }

    var render = function() {
      requestAnimationFrame(render);
      renderer.render(scene, camera);
    };

    console.log(camera);
    console.log(obj['box'])
    render();

    </script>
</body>

我希望这是一些我还不知道的简单事情。

三.js r60


以下是使用正交相机或透视相机进行光线投射时要使用的模式:

var raycaster = new THREE.Raycaster(); // create once
var mouse = new THREE.Vector2(); // create once

...

mouse.x = ( event.clientX / renderer.domElement.clientWidth ) * 2 - 1;
mouse.y = - ( event.clientY / renderer.domElement.clientHeight ) * 2 + 1;

raycaster.setFromCamera( mouse, camera );

var intersects = raycaster.intersectObjects( objects, recursiveFlag );

三.js r.84

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

正交相机并通过光线投射选择对象 的相关文章

随机推荐

  • URL.Action 带有字符串数组?

    我有一个字符串数组 需要在 Url Action 的查询字符串中传递 Url Action Index Resource new FormatIds Model FormatIDs 现在 该链接在我的浏览器中显示为 System Strin
  • 使用 tomcat 9 创建访问文件的符号链接 - 不起作用

    我正在将 tomcat 7 迁移到 tomcat 9 0 33 下面是 tomcat 7 的符号链接访问配置 但该链接在 tomcat 上不起作用 任何人都可以建议如何解决此问题
  • StAX - 如何将 XMLInputFactory.IS_VALIDATING 设置为 true?

    这是我第一次使用 StAX 来解析 XML 文档 仍处于学习阶段 在使用 XMLStreamReader 解析 XML 文档并使用 XMLStreamWriter 生成文档副本的过程中 我遇到了以下警告 在编写器的输出中以注释形式表示 我理
  • elasticsearch 进程的最大文件描述符 [4096] 太低,至少增加到 [65536]

    使用Ubuntu 16 10 码头工人1 12 3 Docker 作曲家 1 8 官方elastic docker镜像的elastic最新标签 docker compose yml version 2 services elastic im
  • mach_vm_region_recurse,在 osx 上映射内存和共享库

    我使用 vm region recurse 64 来映射给定进程的内存 vmmap 样式 然而 尝试通过检查内存中每个库的 Mach O 标头来获取应用程序加载的共享库的完整列表 但 vm region recurse 似乎与 vmmap
  • java TreeSet:比较和相等

    我想要使 用属性 sort 1 排序的对象列表 但是当我想删除时 我希望它使用属性 id 下面的代码代表了这个问题 package javaapplication1 import java util TreeSet public class
  • Java 中有有序集的实现吗?

    如果有人熟悉 Objective C 有一个名为的集合NSOrderedSet https developer apple com library ios documentation Foundation Reference NSOrder
  • 在 xargs 变量上使用 sed 在 shell 扩展内不起作用

    我正在尝试在 Redis 中进行批量密钥重命名 使用 shell 来替换每个密钥名称 在redis内部似乎没有更好的方法来做到这一点 redis cli n 5 KEYS staging xargs I echo RENAME echo s
  • 在哪里可以找到 WSDL.exe?

    我有 Visual Studio 2010 Ulitmate 带有 MSDN Premium 但我似乎找不到这个文件 我尝试安装 Visual Studio SDK 但似乎找不到该文件 我看过 C Windows Microsoft NET
  • 本地主机在 Chrome 中无法工作,127.0.0.1 可以工作

    我正在尝试运行本地节点服务器 但出于某种原因localhost 3000不起作用 错误页面指出This webpage is not available ERR CONNECTION CLOSED然而 127 0 0 1 3000确实有效
  • opencv中图像的二值化

    我在图像二值化方面遇到问题 通常可能模糊 我有这个图像 完成二值化后我得到 我怎样才能更好地进行二值化 我的目标是只有黑色背景和白色字母 没有其他东西 我使用了自适应阈值二值化 cv2 adaptiveThreshold image gs
  • 如何在 ASP.NET C# 中从 Mailgun 接收 HTTP POST?

    http documentation mailgun net quickstart html http documentation mailgun net quickstart html包含 Django 中 http 处理程序的一些示例代
  • 打开deploy.prototxt时出现运行时错误

    我正在尝试使用 caffe 运行一个应该打开的简单代码deploy prototxt但它无法打开文件并引发此错误 RuntimeError Could not open file home ebadawy git caffemodels b
  • XSD 和多态性

    我有点重复这个问题第一次被错误地问到 我有这个
  • 使用一个 NetStream 对象同时传输两个 Video 对象

    我试图将单个 NetStream 对象附加到两个单独的视频对象 而不是从服务器拉出冗余流 预期的行为是两个视频显示相同的内容 但是 我附加 NetStream 的最后一个视频似乎是唯一会显示内容的视频 还有其他人遇到过这个吗 如果不需要 我
  • 白色背景的错误屏幕

    当 iOS 上的 React Native 出现异常时 我会看到带有白色背景的错误屏幕 您可以通过点击的单元格看到它实际上具有异常堆栈 只是具有白色背景 不知道为什么会发生这种情况 但是有办法解决吗 在 Android 上 屏幕有红色背景
  • 如何访问 TTestSetup 类中 TTestCase 的字段

    我正在使用 DUnit 创建单元测试 我有一个类需要很长时间才能初始化 我从 TTestSetup 派生一个类 TMyTestSetup 并重写其 Setup 方法 对于我的 TTestCase 中的所有测试 仅调用此 SetUp 方法一次
  • 无法连接到 Dockerfile 中的 Wildfly

    我正在创建一个自定义 Dockerfile 其中包含官方 keycloak docker 映像的扩展 我想更改网络上下文并添加一些自定义提供程序 这是我的 Dockerfile FROM jboss keycloak 7 0 0 COPY
  • 屏幕截图不提供整个屏幕的图像

    我正在制作与图像相关的应用程序 我的屏幕上有多个图像 我已经拍了屏幕截图 但它不应该提供我的整个屏幕 最顶部和最底部的一小部分不需要在其中显示 我的顶部有导航栏 底部还有一些按钮 我不想在屏幕截图中捕获该按钮和导航栏 下面是我的屏幕截图代码
  • 正交相机并通过光线投射选择对象

    我在使用光线投射器使用正交相机选择对象时遇到了一些困难 不过 当我使用透视相机时 我没有任何问题 在两者之间切换时 我唯一要改变的是相机类型 我可以在正交视图上选择面 但它仅与我在屏幕上单击的位置松散相关 当我可以在远离物体的地方点击时 它