小编Jon*_*Jon的帖子

透视分割后的Z值始终小于-1

所以我正在编写自己的自定义3D转换管道,以便更好地理解它是如何工作的.我可以正确地将所有内容渲染到屏幕上,现在我要回去查看裁剪.

根据我的理解,如果透视分割后的x或y值超出[-1,1]的范围,我应该剪切一个顶点,如果z值超出[0,1]的界限,我应该剪裁一个顶点.

但是,当我实现它时,我的z值始终为-1.xxxxxxxxxxx,其中xxxxxxx是一个非常小的数字.

这有点长,我道歉,但我想确保我提供了所有可能的信息.

第一个惯例:

我正在使用左手系统,其中Matrix看起来像这样:

[m00, m01, m02, m03]
[m10, m11, m12, m13]
[m20, m21, m22, m23]
[m30, m31, m32, m33]
Run Code Online (Sandbox Code Playgroud)

我的矢量是这样的列:

[x]
[y]
[z]
[w]
Run Code Online (Sandbox Code Playgroud)

我的相机设置为:

PI/4弧度的垂直FOV.

方位比1.(方形视口)

近剪辑值为1.

远剪辑值为1000.

初始世界x位置为0.

初始世界y位置为0.

初始世界z位置为-500.

相机向下看Z轴(0,0,1)

给定一个顶点,管道的工作方式如下:

步骤1:将顶点乘以相机矩阵.

第2步:将顶点乘以投影矩阵.

投影矩阵是:

[2.41421, 0,       0,         0]
[0        2.41421, 0,         0]
[0,       0,       1.001001,  1]
[0,       0,       -1.001001, 0]
Run Code Online (Sandbox Code Playgroud)

步骤3:将x,y和z分量乘以1/w.

第4步: [这就是问题所在]如果外边界,则剪切顶点.

第5步:转换为屏幕坐标.

我有一个示例顶点

(-100, -100, 0, 1)
Run Code Online (Sandbox Code Playgroud)

在乘以相机矩阵后,我得到:

(-100, -100, 500, 1)
Run Code Online (Sandbox Code Playgroud)

这是有道理的,因为相对于相机,该顶点是左侧和下侧100个单位,前方500个单位.它也在1的近剪辑和1000的远剪辑之间.W仍然是1.

在乘以投影矩阵后,得到:

(-241.42135, -241.42135, …
Run Code Online (Sandbox Code Playgroud)

opengl directx 3d projection

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

使用pthreads线程Box2D

所以我基本上试图实现一个AIR Native Extension,它通过Actionscript在C中进行物理模拟.

我已经经历了很多次迭代,为了感兴趣,我将在下面列出,我认为这是我最终尝试以更高效的方式工作.

最后,我正在寻找帮助,我应该如何设置一个线程环境,在单独的线程上运行Box2D的模拟,然后轮询AS3中的状态.

方法:

  1. 蛮力:

在这个方法中,我只是从AS3调用C并告诉它创建一个世界并传递一些框来添加到这个世界.在AS3的每一帧中,我调用C来告诉世界Step,然后循环遍历World中的所有body,获取它们的位置和旋转,将它们转换为actionscript对象并将它们放入actionscript数组然后将其发送回AS3.在那里,我遍历返回的数组并将这些位置和旋转值分配给我的精灵,以便它们可视地更新.

结果实际上相当不错,在帧速率受到影响之前添加了大约116个盒子.这与纯AS3实现中的30个盒子相比.请注意,这些统计信息处于调试模式.在发布模式下,它们都可以使用大约120个盒子.AS3实现与Native Extension实现之间几乎没有区别.

  1. ByteArray分享

为了提高性能,我决定尝试限制在C和AS3上编组的数据量是个好主意.ANE支持共享一个字节数组的内存空间,因此我将在AS3中创建的ByteArray发送给C并让C简单地更新ByteArray.这使我们不必在C中构造AS3对象并将其传回.每一帧,AS3只需迭代它的ByteArray,看看C写入了什么,然后将这些值分配给精灵来设置视觉状态.

这里的结果遗憾地大致相同.改进只是微不足道的.

  1. 从C直接对象设置

ANE能够做的另一件事是设置AS3中对象的属性.在这个意义上,我的目的是消除将数据传递回AS3的开销,循环通过主体收集C中的数据以及在AS3中循环以分配值.我直接修改了Box2D代码,这样当它的值被改变时,它会直接在相应的Sprite上写入新的x,y,旋转值.

由于设置这些属性的调用远低于毫秒,因此在非常少量的对象中结果令人惊讶.问题是,这会线性地扩展到大约90个左右的对象,开销太严重而且事情开始变慢.

  1. 穿线

在这一点上,我有点难过.编组数据存在开销,C中有成本用于迭代和构造要返回的数据,AS3中有成本用于迭代为精灵分配值.

显然需要进行权衡,所以我目前的解决方案是我现在能想到的最好的解决方案.

在AS3方面,你打电话给C来创建你的世界,打电话给那个世界添加一个盒子,然后打电话告诉你想要刷新你的数据.当在AS3中创建框时,它们将获得唯一的ID,并将它们存储在字典中,其中密钥为id.

在C方面,创建了世界,并生成了一个新的pthread来执行Step.基本上在另一个线程上模拟世界.在它执行之后,它组装所有数据并将其写入双数组.然后它一次又一次地这样做.它只是基本上模拟它自己的线程.

当我们呼叫C添加一个新框时,我需要创建一个新框并将其添加到该世界.由于世界是步进,这可能会导致问题,这意味着我需要使用互斥锁,我很确定.

当我们调用AIR中刷新的值时,我会想要从双精度数组中执行memcpy到AS3 bytearray中,然后遍历bytearray来设置视觉上的值.

互斥体给了我麻烦所以我基本上实现了我自己,你可以在下面看到...并笑:)

然而它确实有效,只是没有我想要的那么快.大约90后我们再次放慢速度.

有人有任何想法或指示?非常感谢!

C代码

解析器正在运行,所以我在这里粘贴它:http: //pastebin.com/eBQGuGJX

AS3代码

解析器也是如此.我只包含处理AS3中每个帧的相关方法. http://pastebin.com/R1Qs2Tyt

multithreading pthreads box2d game-physics

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

C++函数指针/回调的最佳实践

在处理自定义回调或函数指针时,我正在寻找最佳实践方面的一些指导.

我现在有两个主要用例.

  1. 我的班级里面有一个阻塞循环,永远循环.我希望外部用户能够指定在该循环的每次迭代中调用的函数.

防爆.

myClass.setLoopFunction(doStuff); 
Run Code Online (Sandbox Code Playgroud)

doStuff是位于其他地方的函数,它将在循环的每次迭代中被调用.

  1. 我从一个可以对应多个值的函数中获取一个int.我想动态地将函数映射到这些值,所以我可以在int上查找,然后调用相应的函数.

防爆.

myFunctionMap[passedInt]();
Run Code Online (Sandbox Code Playgroud)

其中int充当查找正确函数的键.

我知道我的语法可能已关闭,我将需要使用std :: map并传递指针等,但任何帮助,指导或陷阱都将不胜感激.

谢谢!

编辑:

我现在将以下声明为公共变量:

class Window {

public:
//The processing function can be from any class and takes in no arguments and returns void
template<class T>
std::function<void(T*, void)> processingFunction;

};
Run Code Online (Sandbox Code Playgroud)

我想要的功能是任何类都可以传入一个接受0参数并返回void的函数,我会将其设置为我的处理函数.在while循环中,我将执行该processingFunction,它将调用该原始类的成员函数.

while(true) {
    if (exitCondition == false) {
        //Execute processing function
        processingFunction();
    }
    else {
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

我觉得我完全错过了模板,std :: function和/或std :: bind的东西.然后,这是一个很好的四个小时的互联网搜索,所以也许我只需要睡在它上面.

c++

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

标签 统计

3d ×1

box2d ×1

c++ ×1

directx ×1

game-physics ×1

multithreading ×1

opengl ×1

projection ×1

pthreads ×1