标签: mouse-picking

如何使用SceneKit在场景中找到鼠标点?

我在SceneKit中设置了一个场景,并发出了一个命中测试来选择一个项目.但是,我希望能够在场景中沿着平面移动该项目.我继续接收鼠标拖动事件,但不知道如何将这些2D坐标转换为场景中的3D坐标.

我的情况很简单.摄像机位于0,0,50并指向0,0,0.我只想沿z平面拖动我的对象,其z值为0.

命中测试就像魅力一样,但是如何将拖动事件中的鼠标点转换为我拖动的3D对象的场景中的新位置?

opengl 3d mouse-picking scenekit

13
推荐指数
1
解决办法
6681
查看次数

用光线投射对象拾取

我在使用光线投射算法检测盒子中的鼠标命中时遇到了不准确的问题.我完全不知道如何正确地解决这个问题,这让我困扰了好几个星期.

使用图片(以[0,0,-30]为中心的框)最容易描述问题:

屏幕截图的问题

黑色线代表绘制的实际hitbox,绿色框代表实际看起来被击中的内容.注意它是如何偏移的(如果盒子离原点更远,它似乎变得更大)并且略小于绘制的hitbox.

这是一些相关的代码,

光线投射:

double BBox::checkFaceIntersection(Vector3 points[4], Vector3 normal, Ray3 ray) {

    double rayDotNorm = ray.direction.dot(normal);
    if(rayDotNorm == 0) return -1;

    Vector3 intersect = points[0] - ray.origin;
    double t = intersect.dot(normal) / rayDotNorm;
    if(t < 0) return -1;

    // Check if first point is from under or below polygon
    bool positive = false;
    double firstPtDot = ray.direction.dot( (ray.origin - points[0]).cross(ray.origin - points[1]) );
    if(firstPtDot > 0) positive = true;
    else if(firstPtDot < 0) positive = false;
    else return -1; …
Run Code Online (Sandbox Code Playgroud)

opengl casting mouse-picking ray-picking

9
推荐指数
1
解决办法
9068
查看次数

使用选择框选择3D曲面(以两种不同的方式)

我正在创建一个建模软件.我的模型都是由平面多边形组成的,这些多边形只是我用OpenGL显示的一组有序顶点.我已经做了很多搜索,令我惊讶的是我没有找到有关我正在寻找的应用程序的更多信息.

我试图使用矩形框来选择表面.这听起来很简单,但我希望它的工作方式与此方法在许多程序中的工作方式相同.这些是我要求的要求:

  1. 我想要一个从左边开始的矩形,然后右边只选择那些完全包含在框内的对象.
  2. 从右侧开始向左的矩形应选择任何被触摸的表面(它不必完全封闭.
  3. 应选择/触摸矩形中的所有对象.换句话说,我想选择对象是否可见.即使被另一个表面覆盖,也应该选择适合盒子内部的所有东西.

名单上的第3位是最重要的.选择1和2都是首选,但如果它被证明过于难以实现,我只能使用其中一个.

我已经查看了有关3D拾取的各种其他帖子,似乎大多数建议采用颜色或光线投射.我使用颜色选择进行正常的点击选择,但是因为我希望选择框选择不可见的表面,所以这不是一个选项.似乎光线投射仅适用于单个点而不是盒子.那么还有其他方法可以直接实现我的目标吗?我认为这将是一项相当普遍的任务,因为它似乎存在于许多建模软件中,但遗憾的是我无法找到适合我需求的方法.

可以理解算法的伪代码,但不是必需的.至少我正在寻找一种方法,我可以自己研究并找到一些例子; 我根本不知道适当的地方.

opengl 3d mouse-picking

8
推荐指数
2
解决办法
1078
查看次数

OpenGL将最近世界3D的3D坐标指向当前鼠标位置

在OpenGL上下文中,我已经看到可以将鼠标坐标转换为3D世界坐标(例如,带有Opengl的MFC从鼠标的2d坐标获得3d坐标).但是,当我只有一组GLPoints和大量空白空间时,这不起作用:当我将鼠标悬停在空白区域时,3D坐标没有任何意义.

如何获取最近的3D点到我鼠标位置的坐标?

c++ opengl 3d mouse-picking

7
推荐指数
1
解决办法
1218
查看次数

OpenGL ES(iPhone)Touch Picking

希望在ES中进行经典的OpenGL鼠标选择.我不想使用第三方库,GLU端口和OpenGL名称堆栈等.这几乎留下了逆视图变换和光线交叉,对吗?

在以下的帮助下,我已经走得很远:http : //trac.bookofhook.com/bookofhook/trac.cgi/wiki/MousePicking http://eigenclass.blogspot.com/2008/10/opengl-es-picking-使用射线boundingbox.html

..但我还没有.这也是一个更容易的方式!

这是一些代码:

    -(void)handleTouch:(CGPoint)point {
    GLfloat width = backingWidth;
    GLfloat height = backingHeight;
    GLfloat x = point.x;
    GLfloat y = point.y;
    GLfloat z = 0.0f;

    //viewport -> normalized dev coord -> clip
    GLfloat n[] = {
        2 * x / width - 1,
        2 * y / height,
        2 * z - 1,
        1
    };

    float fov = 45.0f * (M_PI / 180.0f);
    float near = 0.01, far = 10.0f;
    float aspect = (float)backingWidth / …
Run Code Online (Sandbox Code Playgroud)

iphone opengl-es touch mouse-picking

6
推荐指数
1
解决办法
4469
查看次数

OpenGL 中的射线球相交

我正在尝试使用射线球相交在 OpenGL 中执行鼠标拾取。我在网上找了几个公式,最后一个是 Stack Exchange 上的一个用户推荐的:

射线球相交

根据我对这个答案的理解,我正在检查二次方程是否有正根。我真的不在乎交点在哪里发生,只要光线与球体相交。我的代码如下,但似乎不起作用。

bool Mesh::useObject(vec3 camera, vec3 direction) {

    // a = (xB-xA)²+(yB-yA)²+(zB-zA)²
    float a = ((direction.v[0] - camera.v[0])*(direction.v[0] - camera.v[0])
        + (direction.v[1] - camera.v[1])*(direction.v[1] - camera.v[1])
        + (direction.v[2] - camera.v[2])*(direction.v[2] - camera.v[2]));

    // b = 2*((xB-xA)(xA-xC)+(yB-yA)(yA-yC)+(zB-zA)(zA-zC))
    float b = 2 * ((direction.v[0] - camera.v[0])*(camera.v[0] - mOrigin.v[0])
        + (direction.v[1] - camera.v[1])*(camera.v[1] - mOrigin.v[1])
        + (direction.v[2] - camera.v[2])*(camera.v[2] - mOrigin.v[2]));

    // c = (xA-xC)²+(yA-yC)²+(zA-zC)²-r²
    float c = ((camera.v[0] - mOrigin.v[0])*(camera.v[0] - mOrigin.v[0])
        + (camera.v[1] - mOrigin.v[1])*(camera.v[1] …
Run Code Online (Sandbox Code Playgroud)

c++ opengl graphics geometry mouse-picking

5
推荐指数
1
解决办法
1206
查看次数

如何在没有gluUnProject的情况下在现代OpenGL中进行挑选?

如何在不使用gluUnProject的情况下将屏幕坐标转换为现代OpenGL中的世界坐标?

opengl mouse-picking opentk

4
推荐指数
1
解决办法
3686
查看次数

XNA 2D鼠标选择

我正在使用XNA开发一个简单的2D实时策略游戏.现在我已经达到了我需要能够点击单元或建筑物的精灵并且能够引用与该精灵相关联的对象的点.根据我过去三天所做的研究,我发现了许多关于如何在3D中进行"鼠标拾取"的参考资料,这似乎不适用于我的情况.我知道另一种方法是简单地在世界中拥有一个包含所有"可选"对象的数组,当玩家点击一个精灵时,它会根据数组中所有对象的位置检查鼠标位置.我对这种方法的问题是,如果单位和建筑物的数量增长到更大的数量,它会变得相当慢.(它似乎也不是很优雅)所以我还能做些什么呢?(请注意,我还研究了使用哈希表将对象与精灵位置相关联的想法,并使用二维数组,其中数组中的每个位置代表世界上的一个像素.再一次,他们看起来更像笨重的做事方式.)

c# xna 2d mouse-picking

2
推荐指数
1
解决办法
4172
查看次数

数百万原始人的哪种鼠标采摘策略?

我使用VBO渲染基于milions(最多十个)三角形的模型,我需要检测用户可以点击哪些三角形.

我尝试阅读并理解"名称堆栈"和"独特颜色"的工作原理.我发现名称堆栈最多只能包含128个名称,而唯一颜色最多可包含2 ^(8 + 8 + 8)= 16777216种不同的颜色,但有时可能会有一些近似值,因此它可以得到改性..

对我来说哪个是最好的策略?

opengl jogl selection mouse-picking

2
推荐指数
2
解决办法
2412
查看次数

在 OpenGL 中使用鼠标拾取在 3D 空间中拖动 3D 点的最佳方法?

通过鼠标拾取拖动 3D 点的最佳方法是什么?问题不在于拾取,而在于在 3D 空间中拖动。

我想有两种方法,一种是使用 gluUnProject 获取世界视图坐标并平移 3D 点。这种情况下的问题是,它仅在具有深度值的表面上(使用 glReadPixels),如果鼠标离开表面,它会根据 gluUnProject 的 winZ 组件给出最大或最小深度值。而且在某些情况下它不起作用。

第二种方法是使用 GL_MODELVIEW_MATRIX 沿 XY、XZ、YZ 平面拖动。但这种情况下的问题是,我们如何知道我们是在 XY、XZ 还是 YZ 平面上?我们如何知道轨迹球的前视图在 XY 平面内,如果我们想在侧平面而不是前平面上拖动怎么办?

那么,有没有什么方法可以为我提供准确的 2D 到 3D 坐标,以便我可以轻松地在各个方向上拖动 3D 点,而无需考虑平面情况?一定有办法的,我见过3D软件,他们有完美的拖动功能。

c++ opengl 3d drag-and-drop mouse-picking

2
推荐指数
1
解决办法
5156
查看次数

如何将屏幕上的鼠标坐标转换为3D坐标

我正在使用C++中的GLUT创建一个3D应用程序.

现在,我想实现一个类似于此的方法:

Vector3* MyClass::get3DObjectfromMouse(int mouseX, int mouseY);

我该如何实现这个方法?

c++ opengl glut mouse-picking

0
推荐指数
1
解决办法
2230
查看次数

GPU拾取-精灵周围的不可见像素

我正在渲染一个包含精灵的采摘场景。当我的光标靠近精灵时,它注册为一种颜色并被“选中”。放大小精灵时,此不可见的边框会变大。

打开控制台以查看实时打印的ID。将光标移近或移远,移至大和小的精灵。您会看到精灵在不可见的边框上被选中。对于常规几何图形,仅对于精灵,不会发生此行为。

这很奇怪,因为我正在渲染renderer.readRenderTargetPixels实际看到的东西。

如何摆脱看不见的边界,以进行更准确的拾取?

在此处输入图片说明

var renderer, scene, camera, controls;

var particles, uniforms;

var PARTICLE_SIZE = 50;

var raycaster, intersects;
var mouse, INTERSECTED;

var pickingTexture;

var numOfVertices;

init();
animate();

function init() {

    container = document.getElementById('container');

    scene = new THREE.Scene();

    camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 10000);
    camera.position.z = 150;

    //

    var geometry1 = new THREE.BoxGeometry(200, 200, 200, 4, 4, 4);
    var vertices = geometry1.vertices;
    numOfVertices = vertices.length;

    var positions = new Float32Array(vertices.length * 3);
    var colors = …
Run Code Online (Sandbox Code Playgroud)

picking mouse-picking three.js

0
推荐指数
1
解决办法
621
查看次数