我在用着
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,而不是之后,而且我正在进行逆投影。我究竟做错了什么?
我问过一个类似的问题让我到了现在的位置,但我真的需要一些帮助.这是我完成一些很酷的事情的最后一件事(在我的眼里大声笑)
我有一个三维世界,我可以四处走动,在这个世界上是简单的立方体.
使用函数 - (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) 我试图在我使用正交相机的场景中挑选物体.我的代码片段已经有效,但不准确.我已经在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.
任何提示都将非常感激.谢谢,干杯!
我正在尝试使用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中执行此操作?谢谢.
简而言之:众所周知,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) 我正在渲染一个包含精灵的采摘场景。当我的光标靠近精灵时,它注册为一种颜色并被“选中”。放大小精灵时,此不可见的边框会变大。
打开控制台以查看实时打印的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 ×6
opengl ×3
three.js ×2
3d ×1
c++ ×1
iphone ×1
math ×1
opengl-es ×1
orthographic ×1
pyglet ×1
python ×1
ray-picking ×1
raycasting ×1