小编Mat*_*man的帖子

正交基的四元数

我有一个沿速度矢量移动的射弹物体.我需要确保物体始终面向速度矢量的方向.此外,我使用四元数而不是矩阵表示对象旋转.

我知道第一步是找到一个正交基础:

forward = direction of velocity vector
up = vector.new(0, 1, 0)
right = cross(up, forward) 
up = cross(forward, right)
Run Code Online (Sandbox Code Playgroud)

我如何将基础转换为旋转四元数?

请注意,我想赞扬Noel Hughes提供的答案,但我想用自己的经验来澄清.伪代码如下:

   vec3 vel = direction of velocity vector
   vec3 forward = (1, 0, 0)  // Depends on direction your model faces. See below.
   vec3 axis = cross(forward, vel)
   if (axis == 0) then quit // Already facing the right direction!
   axis = normalize(axis)
   float theta = acos(vel.x/sqrt(vel.x^2, vel.y^2, vel.z^2))
   quat result = (0, axis.y * sin(theta/2), …
Run Code Online (Sandbox Code Playgroud)

quaternions game-physics

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

生产编译器是否使用解析器生成器?

我听说"真正的编译器编写者"使用自己的手工解析器而不是使用解析器生成器.我也听说过解析器生成器不会为真实语言剪切它.据说,使用解析器生成器很难实现许多特殊情况.我对此表示怀疑:

  1. 从理论上讲,GLR解析器生成器应该能够处理大多数编程语言设计(除了C++ ......)
  2. 我知道至少有一种使用解析器生成器的生产语言:Ruby [1].
  3. 当我在学校学习编译器课程时,我们使用了解析器生成器.

所以我的问题是:使用解析器生成器编写生成编译器,或使用解析器生成器被编译器社区认为是一个糟糕的设计决策是否合理?

[1] https://github.com/ruby/ruby/blob/trunk/parse.y

compiler-construction parsing parser-generator

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

如何从stdin运行Python源代码本身从stdin读取?

我有一个Python源文件,如下所示:

import sys
x = sys.stdin.read()
print(x)
Run Code Online (Sandbox Code Playgroud)

我想通过将它传递给Python的stdin来调用这个源文件:

python < source.py

之后source.py被读出,我想Python程序开始从stdin读取(如上所示).这甚至可能吗?似乎解释器source.py在获得EOF之前不会处理,但是如果收到EOF,那么sys.stdin.read()将无法工作.

python

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

如何使用 gdb 调试进程而不暂停它?

我有一个已经在运行的进程,我想用 GDB 调试它。我一直在使用

gdb --pid $PID
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做时,该过程会暂停。我想附加到进程而不暂停它,并在它仍在运行时在其内存中查看。这可能吗?或者,有没有办法“分叉”该进程,以便我可以查看其内存,而无需停止/暂停该进程?

debugging gdb

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

如何在x86中编写C"&&"运算符?

如何在x86中编写C'&&'运算符?例如:

int a = ...
int b = ...
int c = a && b;
Run Code Online (Sandbox Code Playgroud)

相当于x86中的最后一行是什么?

编辑:我想在没有任何跳跃的情况下完成上述操作.

编辑:g ++生成这个,但我不明白:

testl   %edi, %edi
setne   %dl
xorl    %eax, %eax
testl   %esi, %esi
setne   %al
andl    %edx, %eax
Run Code Online (Sandbox Code Playgroud)

c x86 assembly

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

使用 NASM 加载符号的地址?

我有一些程序集需要在 OS X (x86-64) 中加载 C 符号。使用 x86,您执行此操作的方式是:

mov rax, some_symbol_name
Run Code Online (Sandbox Code Playgroud)

但是,对于 x86-64,这会导致链接警告:

ld:警告:PIE 已禁用。在代码签名的 PIE 中不允许使用绝对寻址(可能是 -mdynamic-no-pic),但在 Test2.o 的 _main 中使用。
要修复此警告,请不要使用 -mdynamic-no-pic 编译或使用 -Wl,-no_pie 链接

注意:我知道 PIE 是什么,我不想禁用它。以下是我将符号地址加载到寄存器中的一些其他尝试:

movq rax, some_symbol_name          ; Link warning
lea rax, [rel some_symbol_name]     ; No link warning, but doesn't always get correct address
Run Code Online (Sandbox Code Playgroud)

我真的被这个(看似)简单的问题难住了。我已经查看了 GAS 反汇编,它似乎正在按照上述方式做一些事情lea,但是我无法让 NASM 生成正确的代码。

编辑:作为参考,这是由 GAS 生成的汇编代码:

leaq    some_symbol_name(%rip), %rax
Run Code Online (Sandbox Code Playgroud)

macos assembly x86-64 nasm

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

用于Windows的SIGCHLD替换

我希望在Windows上具有SIGCHLD功能(即,当孩子死亡时通知父进程).我知道Windows API中没有与SIGCHLD等效的东西,但我想知道用Windows实现这一点的常用方法是什么.我确信这是Windows开发人员经常遇到的问题.

我现在能想到的唯一解决方案是让孩子们看看他们是否还活着.

注意:我的应用程序是单线程的,如果可能的话我想保持这种方式.该应用程序具有非阻塞事件循环(使用select()).

c windows winapi sigchld

3
推荐指数
2
解决办法
1707
查看次数

如何在Linux中保留虚拟内存?

我有一个应用程序,使用带有MEM_RESERVE标志的Windows上的VirtualAllocEx保留连续的内存块.这会保留虚拟内存块,但不会使用物理页面或页面文件块进行备份.因此,访问分配的内存将导致分段错误 - 但其他分配将不会与此虚拟内存块相交.

如何使用mmap为Linux做同样的事情?我确实注意到了这个问题的答案,但这确实可以保证,如果我不触摸分配的页面,1 GB的物理内存将不会分配给我的进程吗?我不想要任何颠簸问题.

linux windows mmap

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