标签: picking

反向透视投影

我在用着

worldview_inverse * (projection_inverse * vector)
Run Code Online (Sandbox Code Playgroud)

将屏幕空间坐标转换为世界空间坐标。我假设

(x,y,1,1)
Run Code Online (Sandbox Code Playgroud)

会变换为远平面上的一个点,而

(x,y,-1,1)
Run Code Online (Sandbox Code Playgroud)

变换为近平面上的点,并连接线我可以查询视锥体中与线相交的所有对象。转换后,我将结果点除以它们各自的 .w 分量。这适用于远平面,但近平面上的点以某种方式转换为世界空间原点。

我认为这与我输入逆投影的 1 的 w 分量有关,因为通常在投影之前它是 1,而不是之后,而且我正在进行逆投影。我究竟做错了什么?

opengl math 3d reverseprojection picking

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

iPhone:OpenGL ES:检测您是否在屏幕上点击了一个对象(立方体)

我问过一个类似的问题让我到了现在的位置,但我真的需要一些帮助.这是我完成一些很酷的事情的最后一件事(在我的眼里大声笑)

我有一个三维世界,我可以四处走动,在这个世界上是简单的立方体.

使用函数 - (CGPoint)getScreenCoorOfPoint:(IMPoint3D)_point3D我可以找出这些立方体在3D世界中的X,Y的位置.但它不是基于我的位置,而是基于3d区域.使用相同的功能,我也可以解决我的问题.我也可以找到有人在屏幕上点击的位置.

我如何将这些一起映射到一起,这样如果我点击其中一个,我就可以解决这个问题?

当然,我需要一些东西来解决我面临的方式.人们建议将它们放在屏幕上并做一些事情,但它完全超出了我的想象.我想基于3d coords(以某种方式)废弃函数并构建自己的函数

for (NSDictionary *item in self.players)
{
    int x;
    int z;

    x =  [[item objectForKey:@"posX"] floatValue];
    z =  [[item objectForKey:@"posZ"] floatValue];

    IMPoint3D playerPos;
    playerPos.x = x;
    playerPos.z = z;
    playerPos.y = 1;

    CGPoint screenPositionOfThisCube  ; 
    screenPositionOfThisCube = [self getScreenCoorOfPoint:playerPos];


    #define TUNE 28
    CGRect fingerSquish = CGRectMake(
                                     screenPositionOfThisCube.x - TUNE,
                                     screenPositionOfThisCube.y - TUNE,
                                     TUNE * 2,
                                     TUNE * 2);

    // now check that the POINT OF THE TOUCH
    // is inside the rect …
Run Code Online (Sandbox Code Playgroud)

iphone opengl-es picking

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

three.js正交相机对象拾取

我试图在我使用正交相机的场景中挑选物体.我的代码片段已经有效,但不准确.我已经在stackoverflow上找到了一些答案,但是这些已被弃用或根本不再有效.这是我的代码onMouseDown

function onDocumentMouseUp( event ) {
    event.preventDefault();

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

    var vector = new THREE.Vector3(mouse.x, mouse.y, 0.5);
    var pos = camera.position;
    var ray = new THREE.Raycaster(pos, vector.unproject(camera).sub(camera.position).normalize());

    var intersects = ray.intersectObjects(objects);

    if (intersects.length > 0) {
        console.log("touched:" + intersects[0]);
    }
    else {
        console.log("not touched");
    }
}
Run Code Online (Sandbox Code Playgroud)

请参阅http://jsfiddle.net/ujzpe07t/1/

如果你点击立方体左/右/上/下的一些像素,它仍然告诉我对象被触摸了.

我正在使用three.js r69.

任何提示都将非常感激.谢谢,干杯!

picking orthographic three.js raycasting

3
推荐指数
1
解决办法
2604
查看次数

使用Pyglet进行OpenGL挑选

我正在尝试使用Pyglet的OpenGL包装器实现拾取,但是我在将C教程转换为Python时遇到了麻烦.具体是下面的部分.

#define BUFSIZE 512
GLuint selectBuf[BUFSIZE]

void startPicking(int cursorX, int cursorY) {
    GLint viewport[4];

    glSelectBuffer(BUFSIZE,selectBuf);
    glRenderMode(GL_SELECT);

    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glLoadIdentity();

    glGetIntegerv(GL_VIEWPORT,viewport);
    gluPickMatrix(cursorX,viewport[3]-cursorY,
            5,5,viewport);
    gluPerspective(45,ratio,0.1,1000);
    glMatrixMode(GL_MODELVIEW);
    glInitNames();
}

我不知道如何转换声明GLuint或GLint的数组,以便glSelectBuffer和glPickMatrix工作.有没有人知道如何使用Pyglet在Python中执行此操作?谢谢.

python opengl pyglet picking

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

opengl 中的“对象映射”

简而言之:众所周知,opengl 在屏幕上绘制了许多三角形。

我想知道的是:

如果opengl绘制三角形,它必须知道,哪个三角形属于屏幕上的哪个像素,对吗?

我也能得到这些信息吗?例如,在绘制之后调用一个函数(类似gl_retrieve_object_map()或类似的东西),我知道哪个像素显示哪个三角形?

就像为每个像素挑选一样

我在想一个二维数组告诉我三角形索引或其他什么:

例如在 10x10 像素的屏幕上:

0 0 1 1 1 1 1 0 0 0
0 0 0 1 1 1 1 0 2 0
0 0 0 0 1 1 1 2 2 0
0 0 0 0 0 1 1 2 2 0
0 0 0 0 0 2 1 2 2 0
0 0 0 0 2 2 2 2 2 0
0 0 0 2 2 2 …
Run Code Online (Sandbox Code Playgroud)

c++ opengl picking ray-picking

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

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
查看次数