标签: raycasting

体绘制(使用glsl)和光线投射算法

我正在使用光线投射算法学习体绘制.我在这里找到了一个很好的演示和tuturial .但问题是我有一个ATI显卡而不是nVidia,这让我无法在演示中使用cg着色器,因此我想将cg着色器更改为glsl着色器.我已经阅读了OpenGL的红皮书(第7版),但不熟悉glsl和cg.有没有人可以帮我改变演示中的cg着色器到glsl?或者是否有任何材料可以使用光线投射进行体积渲染的最简单演示(当然在glsl中). 是演示的cg着色器.它可以在我朋友的nVidia显卡上运行.令我困惑的是,我不知道如何将cg的入口部分翻译成glsl,例如:

struct vertex_fragment
 {
   float4 Position    : POSITION; // For the rasterizer
   float4 TexCoord    : TEXCOORD0; 
   float4 Color       : TEXCOORD1;
   float4 Pos         : TEXCOORD2;
 };
Run Code Online (Sandbox Code Playgroud)

更何况,我可以编写一个程序将2个纹理对象与2个纹理单元绑定到着色器,前提是我在绘制屏幕时分配两个texcoord,例如

glMultiTexCoord2f(GL_TEXTURE0, 1.0, 0.0);

glMultiTexCoord2f(GL_TEXTURE1, 1.0, 0.0);

在演示中,程序将绑定到两个纹理(一个2D用于backface_buffer一个3D volume texture),但只有一个纹理单元,glMultiTexCoord3f(GL_TEXTURE1, x, y, z);我认为GL_TEXTURE1单位是用于体积纹理,但是哪一个(纹理单位)用于backface_buffer?据我所知,为了在着色器中绑定纹理obj,我必须得到一个纹理单元来绑定例如:

glLinkProgram(p);   
texloc = glGetUniformLocation(p, "tex");
volume_texloc = glGetUniformLocation(p, "volume_tex");
stepsizeloc = glGetUniformLocation(p, "stepsize");
glUseProgram(p);
glUniform1i(texloc, 0); 
glUniform1i(volume_texloc, 1); 
glUniform1f(stepsizeloc, stepsize);
  //When rendering an object with this program.
glActiveTexture(GL_TEXTURE0); …
Run Code Online (Sandbox Code Playgroud)

opengl glsl demo raycasting volume-rendering

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

Three.js 中的 Raycast 只有一个投影矩阵

我正在按照此示例在 Mapbox GL JS 页面中使用 Three.js 渲染一些自定义图层。我想添加光线投射来确定用户点击了哪个对象。

问题是我只从 Mapbox 获得了一个投影矩阵,我用它来渲染场​​景:

class CustomLayer {
  type = 'custom';
  renderingMode = '3d';

  onAdd(map, gl) {
    this.map = map;
    this.camera = new THREE.Camera();
    this.renderer = new THREE.WebGLRenderer({
      canvas: map.getCanvas(),
      context: gl,
      antialias: true,
    });
    this.scene = new THREE.Scene();
    // ...
  }

  render(gl, matrix) {
    this.camera.projectionMatrix = new THREE.Matrix4()
      .fromArray(matrix)
      .multiply(this.cameraTransform);
    this.renderer.state.reset();
    this.renderer.render(this.scene, this.camera);
  }
}
Run Code Online (Sandbox Code Playgroud)

这渲染得很好,并在我平移/旋转/缩放地图时跟踪视图中的变化。

自由岛上的立方体

不幸的是,当我尝试添加光线投射时,出现错误:

  raycast(point) {
    var mouse = new THREE.Vector2();
    mouse.x = ( point.x / this.map.transform.width ) * …
Run Code Online (Sandbox Code Playgroud)

three.js raycasting mapbox-gl-js

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

MySQL实现光线投射算法?

我们需要找到一种快速且相当准确的方法,用于谷地图上的纬度/长值和多边形的多边形点.经过一些研究 - 发现了一些关于mysql几何扩展的帖子,并且也实现了 -

SELECT id, Contains( PolyFromText( 'POLYGON(".$polygonpath.")' ) , PointFromText( concat( \"POINT(\", latitude, \" \", longitude, \")\" ) ) ) AS
            CONTAINS
FROM tbl_points
Run Code Online (Sandbox Code Playgroud)

然而,这并不适用于由大量点组成的多边形:(

在进行了一些更多的研究之后 - 遇到了一种称为Ray-casting算法的标准算法,但是在尝试在MySQL中开发查询之前,想要抓住机会,如果有人已经通过这个或者遇到了一个显示如何实现的有用链接MySQL/SQL-server中的算法.

因此,缩短它 - 问题是:

任何人都可以提供Ray/Cast-algorithm的MySQL/SQL-server实现吗?

其他细节:

  • 多边形是凹面,凸面或复杂的.
  • 定位快速执行超过100%的准确性.

mysql point-in-polygon raycasting

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

扩展PiP算法的MySQL实现?

我需要在多边形 MySQL查询中提出一个观点.

我已经找到了这两个很棒的解决方案

http://forums.mysql.com/read.php?23,286574,286574

MySQL实现光线投射算法?

但是这些函数只能检查一个点是否在poly中.我有一个查询,其中PiP部分应该只是查询的一部分,并检查多边形内的x点.

像这样的东西:

$points = list/array/whatever of points in language of favour

SELECT d.name
FROM data AS d
WHERE d.name LIKE %red%
// just bla bla

// how to do this ?
AND $points INSIDE d.polygon
AND myWithin( $points, d.polygo ) // or
Run Code Online (Sandbox Code Playgroud)

UPDATE

我尝试使用这样的MBR函数:

SET @g1 = GeomFromText('Polygon((13.43971 52.55757,13.41293 52.49825,13.53378 52.49574, 13.43971 52.55757))');
SET @g2 = GeomFromText('Point(13.497834 52.540489)');
SELECT MBRContains(@g1,@g2);
Run Code Online (Sandbox Code Playgroud)

G2不应该在G1内,但MBR说它是.

php mysql point-in-polygon raycasting

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

体素......老实说,我需要知道从哪里开始

好吧,我知道体素基本上只是一个像素的体积版本.

在那之后,我不知道甚至要寻找什么.

谷歌搜索没有显示任何教程,我无法在任何地方找到一本书,我甚至找不到任何与体素真正的基本概念有关的东西.

我对C++库有很多了解,并且掌握了OpenGL的基础知识.

有人能指出我正确的方向吗?

编辑:我想我只是对如何实现它们感到困惑?对不起是一种痛苦,只是因为我无法找到任何我可以轻易关联的内容......我想我想象的是一个体素与一个可以实际存储数据的向量相关.

体素可以表示为任何 3D形状?例如,假设我希望形状为圆柱形.这是可能的,还是他们必须像立方体一样链接?

c++ opengl gpu voxels raycasting

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

Doom和Quake 3D渲染之间的区别

过去几周我一直在研究(旧)3D渲染技术,并认为我现在对Doom中3D渲染的工作方式有了一个公平的理解.它使用光线投射来渲染3D场景,对对象使用精灵,因此不是"真正的"3D.它也不允许真正的上/下,只能通过Y剪切.

Quake是ID的第一个"真正的"3D引擎,具有可以从不同角度查看的对象,并允许向上和向下查看.

现在,在研究这些技术时,我听到了很多"真正的"3D,但我无法清楚地解释这个真正的3D意味着什么.Quake渲染与Doom渲染有何不同?

Quake世界是否使用3D顶点并且它们都是投影而不是用于交叉点的光线投射?

我很想听到有关差异的明确解释!

PS我知道Quake的源代码是可用的,但是id软件的FTP已经停机数周了,我在其他任何地方都找不到它.如果有人知道在哪里可以找到它,请告诉我.

3d quake raycasting

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

正射相机和用raycast选择对象

我使用raycaster使用正交相机选择对象时遇到了一些困难.虽然,当我使用透视相机时,我没有任何问题.我在两者之间切换时唯一要改变的是型号相机.

我可以在正交视图上选择面部,但它与我点击屏幕的位置只是松散相关.当我可以远离物体点击时它仍然会回来,好像它已经击中了靠近它的中心的物体.

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

我在这个例子中基于我的大部分代码,并希望从我的代码中获得非常相似的结果.(这个例子我正在引用透视摄像头)

任何帮助深表感谢

<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, …
Run Code Online (Sandbox Code Playgroud)

javascript orthographic three.js raycasting

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

在DirectX中取消投影屏幕坐标时出现意外结果

为了能够确定用户是否点击了我的任何3D对象,我试图将点击的屏幕坐标转换为矢量,然后我用它来检查我的三角形是否被击中.为此,我使用DirectX提供的XMVector3Unproject方法,并且我在C++/CX中实现了所有内容.

我面临的问题是,未预测屏幕坐标导致的矢量根本不像我预期的那样.下图说明了这一点:

由非投影产生的矢量 点击发生时的光标位置(以黄色突出显示)在左侧的等轴测视图中可见.一旦我点击,由于未投影而产生的矢量出现在图像中指示的模型后面,因为白线穿透模型.因此,它不是始于光标位置而是在等轴测视图中进入屏幕,而是出现在完全不同的位置.

当我在等轴测视图中水平移动鼠标时,单击并在此之后垂直移动鼠标并单击下面的图案.两个图像中的所有线代表由点击产生的矢量.该模型已被删除,以获得更好的可见性.

由非投影产生的矢量源自相同位置 从上面的图像可以看出,所有矢量似乎都来自相同的位置.如果我更改视图并重复该过程,则会出现相同的模式但具有不同的矢量原点.

不同的视角,不同的载体起源

以下是我用来提出这个问题的代码片段.首先,我使用下面的代码接收光标位置,并将其与绘图区域的宽度和高度一起传递给我的"SelectObject"方法:

void Demo::OnPointerPressed(Object^ sender, PointerEventArgs^ e)
{
  Point currentPosition = e->CurrentPoint->Position;

  if(m_model->SelectObject(currentPosition.X, currentPosition.Y, m_renderTargetWidth, m_renderTargetHeight))
  {
    m_RefreshImage = true;
  }
}
Run Code Online (Sandbox Code Playgroud)

"SelectObject"方法如下所示:

bool Model::SelectObject(float screenX, float screenY, float screenWidth, float screenHeight)
{
  XMMATRIX projectionMatrix = XMLoadFloat4x4(&m_modelViewProjectionConstantBufferData->projection);
  XMMATRIX viewMatrix       = XMLoadFloat4x4(&m_modelViewProjectionConstantBufferData->view);
  XMMATRIX modelMatrix      = XMLoadFloat4x4(&m_modelViewProjectionConstantBufferData->model);

  XMVECTOR v = XMVector3Unproject(XMVectorSet(screenX, screenY, 5.0f, 0.0f),
                                  0.0f,
                                  0.0f,
                                  screenWidth,
                                  screenHeight,
                                  0.0f,
                                  1.0f,
                                  projectionMatrix,
                                  viewMatrix,
                                  modelMatrix);

  XMVECTOR rayOrigin = XMVector3Unproject(XMVectorSet(screenX, screenY, 0.0f, 0.0f),
                                          0.0f,
                                          0.0f,
                                          screenWidth,
                                          screenHeight,
                                          0.0f,
                                          1.0f, …
Run Code Online (Sandbox Code Playgroud)

c++ directx 3d projection raycasting

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

更改矩形大小时重新计算光线跟踪/投射成本

我有一系列"光线",我需要测量与下面矩形框相关的成本.外部红色框总是比深绿色框大1米,浅绿色框比深绿色框小10厘米.如果是射线

  1. 穿过深绿色的盒子,我会分配成本c
  2. 在深绿色的盒子上,我将分配成本d
  3. 落在红色区域我将分配成本e
  4. 不与深绿色的盒子相交而不是在红色盒子里,成本为f
  5. d < f < c < e

在此输入图像描述

我目前有以下数据结构和函数来计算成本.我需要计算给定矩形的成本(由4 xy坐标表示),但同时,找到深绿色矩形的近似/局部最佳长度/宽度(即通过保持最接近而收缩或增大尺寸矩形的一角固定),使成本最低.

一个具体的例子是下面的截图.较小的矩形对应于图中的深绿色框.绿线是成本为d的光线,黄线为成本f,绿松石线为成本为c的光线.如果我固定内部矩形的左上角并减小宽度,我可以将turqoise射线从成本c减少到f.
在此输入图像描述

我的问题是,我不知道应该如何改变我的代码或改变我的数据结构,这样我才能通过重新计算受影响的光线找到最佳尺寸(即不再循环遍历所有光线).

struct VRay{
    float range, x, y;
    enum RayType{ PASSTHROUGH, FREE, SURFACE, OCCLUDED, UNIFORM};
    RayType r;
};
struct VScan{
    VRay rays[401];
    int closestIdx;
    int firstIdx;
    int lastIdx;
} vscan;
Run Code Online (Sandbox Code Playgroud)

计算成本的功能:

for (int i = 0; i < 401; i++){
       VRay& r = vscan.rays[i];

       Vector2f cray(r.y, -r.x);
       bool ppBound = false;
       bool ppSurf = false;
       Vector2f vertex =  outBox.row(0);
       Vector2f vertexSurf = surface.row(0); …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm geometry raycasting

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

三个js射线播放OBJ


你好!我有三个j并尝试将它用于我的项目.问题是 - 我需要选择从OBJ文件加载的自定义网格.

我创建了简单的raycaster,简单的立方体和我的模型(也是立方体).问题是 - 我可以对立方体进行光照,但它看不到我的模型.我在哪里可以遇到这个问题?

        var container, stats;
        var camera, scene, projector, renderer;
        var particleMaterial;

                    var textureLoader;
                    var modelLoader;

        var objects = [];

        init();
        animate();

        function init() {

            container = document.createElement( 'div' );
            document.body.appendChild( container );

            camera = new THREE.PerspectiveCamera( 70, window.innerWidth / window.innerHeight, 1, 10000 );
            camera.position.set( 0, 300, 500 );

            scene = new THREE.Scene();

                            var manager = new THREE.LoadingManager();
                            textureLoader = new THREE.ImageLoader( manager );
                            modelLoader = new THREE.OBJLoader(manager);




                            modelLoader.load( 'cube.obj', function ( object ) {

                                object.traverse( …
Run Code Online (Sandbox Code Playgroud)

javascript 3d three.js raycasting

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