我正在编写一个太空探索应用程序。我决定将光年定为单位,并准确地模拟了恒星之间的距离。经过修补和大量艰苦的工作(主要是学习绳索)之后,我从横穿宇宙的飞船的角度使相机正常工作。
最初,我在研究行星对象之前一直不注意gluPerspective()的zNear参数。由于我的缩放单位是光年单位,因此我很快意识到,由于zNear为1.0f,所以我看不到此类对象。经过实验后,我得出了这些数字:
#define POV 45
#define zNear 0.0000001f
#define zFar 100000000.0f
gluPerspective (POV, WinWidth/WinHeight, zNear ,zFar);
Run Code Online (Sandbox Code Playgroud)
这非常有效,因为我能够使我的太阳系巡航(位置0,0,0),并向上移动到看起来明亮且纹理贴图的行星附近。但是,其他系统(不在0,0,0位置)很难通过,因为物体以不寻常的方式从摄像机移开。
但是我注意到,在宇宙中航行时开始出现奇怪的视觉故障。如果我沿Y方向旋转180度,我身后的对象将“环绕”并向前显示,它们也将出现在其原始位置。因此,当在太空中扭曲时,大多数恒星正确地视差,但是有些恒星出现并朝相反的方向行进(至少可以这样打扰)。
通过将zNear更改为0.1f,可以立即纠正所有这些故障(但也无法解决太阳系物体)。所以我被卡住了。我也尝试过使用glFrustum,它会产生完全相同的结果。
我使用以下内容查看世界:
glTranslatef(pos_x, pos_y, pos_z);
Run Code Online (Sandbox Code Playgroud)
带有相关的相机代码以根据需要进行定向。即使禁用相机功能也不会改变任何东西。我什至尝试了gluLookAt()并再次产生相同的结果。
使用极限zNear / zFar值时,gluPerspective()是否有限制?我试图缩小范围,但无济于事。我什至通过缩放所有内容并使用更大的zNear值将世界单位从光年更改为公里,什么也没有。救命!
目前我正在编写一个增强现实应用程序,我在屏幕上获取对象时遇到了一些问题.对我来说非常令人沮丧的是,我无法将gps-points转换为我的Android设备上相应的屏幕点.我已经在stackoverflow上阅读了很多文章和许多其他帖子(我已经问了类似的问题),但我仍然需要你的帮助.
我做了维基百科中解释的透视投影.
我如何处理透视投影的结果以获得最终的屏幕点?
geometry android projection perspectivecamera augmented-reality
我的应用中有一个相机:
camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );
camera.position.z = 1;
camera.position.y = -5;
camera.rotateOnAxis(new THREE.Vector3(1, 0, 0), degInRad(90));
camera.up = new THREE.Vector3(0, 0, 1);
Run Code Online (Sandbox Code Playgroud)
render当我按下键时,功能中的代码必须旋转相机:
if (leftPressed) {
camera.rotateOnAxis((new THREE.Vector3(0, 1, 0)).normalize(), degInRad(1));
} else if (rightPressed) {
camera.rotateOnAxis((new THREE.Vector3(0, 1, 0)).normalize(), degInRad(-1));
}
if (upPressed) {
camera.rotateOnAxis((new THREE.Vector3(1, 0, 0)).normalize(), degInRad(1));
} else if (downPressed) {
camera.rotateOnAxis((new THREE.Vector3(1, 0, 0)).normalize(), degInRad(-1));
}
Run Code Online (Sandbox Code Playgroud)
相机旋转,但不是我需要的方式.我希望那台相机在飞机上像FPS(第一人称射击游戏)一样旋转.看图片了解我想要的东西......
我试着用它sin(1),cos(1)但无法理解它是如何rotateOnAxis工作的,使translate功能像魅力一样工作,并将相机移动到她所看到的方向.
PS …
有人可以帮助我理解three.js最初是如何确定精灵的大小/比例的吗?
目前,我正在处理 3D 空间中堆叠的 4 个精灵(透明度为 3000 像素?×?1830 像素的 PNG),但我必须将它们放大到 16 倍和 22 倍之间。不过,为了防止精灵看起来被压扁,我必须将 y 轴缩放为 x 轴的 75%。
最终,我希望能够系统地提取图像,并让它们适当地缩放。
可能我只是没有正确设置这个东西。看起来不错,但现在感觉超级hacky。我几乎改变了一堆数字,直到它看起来对我来说是正确的。我不喜欢那样。我想明白。
这是我目前正在使用的内容:http : //valorink.com/3d-test/stackoverflow/
我制作了一个小 Three.js 应用程序,它将一堆圆圈从画布底部移动到顶部:
let renderer, scene, light, circles, camera;
initialize();
animate();
function initialize() {
renderer = new THREE.WebGLRenderer({ alpha: true, antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
scene = new THREE.Scene();
light = new THREE.AmbientLight();
scene.add(light);
circles = new THREE.Group();
scene.add(circles);
camera = new THREE.PerspectiveCamera(45, renderer.domElement.clientWidth / renderer.domElement.clientHeight, 1);
camera.position.z = circles.position.z + 500;
}
function animate() {
// Update each circle.
Array.from(circles.children).forEach(circle => {
if (circle.position.y < visibleBox(circle.position.z).max.y) {
circle.position.y += 4;
} else {
circles.remove(circle);
}
});
// Create …Run Code Online (Sandbox Code Playgroud)我正在学习 OpenGL,目前我正在编写一个着色器,但我很困惑为什么gl_Position变量是 avec4而不是 a vec3,正如我所期望的。我当然希望这样做,因为它使用 3D 空间,而不是 4D。
我希望我至少正确地假设 的前三个字段gl_Position确实是位置的 x、y 和 z 坐标。
如果我的问题还不够清楚:gl_Position.的第四个字段是什么?
顺便说一下,我使用的是 OpenGL 3.2 和 GLSL 1.5。
我想在没有单击和拖动的情况下重新创建 Three.js OrbitControl 运动,即简单地使相机跟随鼠标移动。
我试图从头开始重新创建它,但是太费力了,因为问题是相机在三个轴上移动,而不仅仅是两个。我很确定有些人以前做过。
具体来说,我希望相机围绕场景原点移动,并与它保持相同的距离。
如何让相机在javaFX中围绕3d对象旋转?我知道我可以使用它自己旋转它
camera.setRotate(angle);
Run Code Online (Sandbox Code Playgroud)
但我希望一个物体静止,相机旋转并指向同一个点,就像旋转轴一样.
我正处于用 OpenGL 编写的渲染器的优化阶段,我的下一步是剔除我看不到的所有内容。在阅读本文和其他资源时,我看到了视锥体的视觉描述,例如:
图片来自:https : //www.scratchapixel.com/images/upload/perspective-matrix/camsetup1.png
因此认为我们通过了类似的东西glm::radians(90.0f)。然而,我开始遇到我的算法的剔除问题,因为我认为我会沿着左右各 45 度的飞机……但后来我开始得到误报剔除。一旦我将其更改为使用fov传递给的角度,glm::perspective则剔除开始工作正常。
但是有两件事我不确定:
这些对我来说很重要,因为我想让我的剔除算法在没有误报的情况下尽可能多地剔除。正如您可能猜到的那样,我得到了误报剔除,因为我认为“我需要将我glm::perspective()再次使用的第一个参数除以二以获得角度的一半”,这导致更紧密的截锥体将剔除更多它应该有。
我目前剔除的方式是计算平截头体的左右边缘,并通过点积剔除左侧或右侧边缘无法看到的任何二维线(就像它们是线段)。这就是为什么更窄的角度让我感到悲伤。顺便说一句,如果有更好的方法可以让我知道,尽管我认为两个点积可能是我必须检查的线的计算效率方面最便宜的。
我正在使用 OpenCV+Python+Numpy 并且我在图像中有三个点,我知道这些点的确切位置。
(P1, P2);
N1
Run Code Online (Sandbox Code Playgroud)
我要将图像转换为另一个视图(例如,我将透视图转换为侧视图)。如果我这样做,我将无法获得图像平面中这三个点的确切位置。我应该以一种可以获得这些点的新坐标的方式编写代码。
pts1=np.float32([[867,652],[1020,580],[1206,666],[1057,757]])
pts2=np.float32([[700,732],[869,754],[906,916],[712,906]])
matrix=cv2.getPerspectiveTransform(pts1,pts2)
result=cv2.warpPerspective(Image1,matrix,(1920,1080))
cv2.imshow('Image',Image1) cv2.imshow('Tran',result)
Run Code Online (Sandbox Code Playgroud)
我的问题是:如何确定这 3 个点的新位置?