我正在写一个光线追踪器(主要是为了好玩),虽然我过去写了一个,花了相当多的时间搜索,没有任何教程似乎揭示了透视投影中计算眼睛光线的方式,不使用矩阵.
我相信我最后一次这样做是因为(可能)x/y使用Quaternion类别从摄像机方向矢量无效地旋转眼睛矢量度.这是在C++中,我在C#中做这个,虽然这不是那么重要.
伪代码(假设V*Q =变换操作)
yDiv = fovy / height
xDiv = fovx / width
for x = 0 to width
for y = 0 to height
xAng = (x / 2 - width) * xDiv
yAng = (y / 2 - height) * yDiv
Q1 = up vector, xAng
Q2 = camera right vector, yAng
Q3 = mult(Q1, Q2)
pixelRay = transform(Q3, camera direction)
raytrace pixelRay
next
next
Run Code Online (Sandbox Code Playgroud)
我认为这个问题的实际问题在于它模拟的是球形屏幕表面,而不是平面屏幕.
请注意,虽然我知道如何以及为什么使用交叉产品,点积,矩阵等,但我实际的3D数学问题解决技巧并不是很棒.
所以给出:
为光线跟踪器生成x/y像素坐标的眼睛光线的实际方法是什么?
澄清 …
我正在使用标签栏应用程序,其中一个标签有一个连接到UISearchBar的UISearchDisplayController.它全部连接在NIB上并且正在工作.当我点击搜索栏时,"范围"和"取消"按钮会等等,搜索代理会正确更新结果表.
但是,我正在尝试在viewDidLoad消息中实现相同的代码而不是NIB,但是当我从NIB中删除搜索显示控制器并取消注释我的代码以在函数中创建相同的控制器时,它不起作用.就好像有一些基本的连接没有被创建,所以我的所有搜索委托功能都没有被调用.
这是我的工作搜索显示控制器的NIB版本.它连接到搜索栏,UINavigationController子类(MASearchController)和它的根视图被连接起来searchContentsController.
alt text http://img192.imageshack.us/img192/3050/screenshot20100307at304.png
现在这是您希望在代码中创建相同的内容,对吧?我正在做的是将UISearchBar留在NIB中,以便在代码中一次消除一块拼图.
// [MASearchController viewDidLoad]
UISearchDisplayController *searchController = [[[UISearchDisplayController alloc]
initWithSearchBar:searchBar
contentsController:[[self viewControllers] objectAtIndex:0]] autorelease];
[searchController setDelegate:self];
[searchController setSearchResultsDelegate:self];
[searchController setSearchResultsDataSource:self];
Run Code Online (Sandbox Code Playgroud)
我在运行时检查了所有对象,他们都检查了.基本上我已经从NIB中删除了搜索显示控制器,然后输入代码在viewDidLoad消息中创建它.
为什么这不起作用?搜索键盘出现但我的搜索和按钮动画功能都不起作用???
iphone search objective-c uisearchbar uisearchdisplaycontroller
我正在使用一个简单的脚本语言API实现标记和清除垃圾收集,我正在阅读有关垃圾收集的各种实现.像Lua这样的API使用带有白色,灰色和黑色列表的标记和扫描.
问题是,我似乎无法找到解释为什么有这样的列表以及为什么将它们放入这些特定的颜色.
在我目前的,琐碎的实现中,我只是使用"死"或"活"状态.在扫描中,删除死对象.我正在使用本机堆,因此我没有在GC中进行任何移动.
我是用C写的.
// Performs a full garbage collection
void GorCollect(GorContext *ctx)
{
Value *v, *end;
Collectable *c, *n;
// mark stack references
end = ctx->stack + ctx->stackTop + 1;
v = ctx->stack;
while(v != end)
{
if (gvisgc(v) && v->v.gc) // mark if a collectable obj
Mark(v->v.gc);
v = v++;
}
// mark global references
if (ctx->global)
Mark((Collectable *)ctx->global); // ctx->global is a collectable obj
// perform sweep
c = ctx->gchead; // full list of collectable objs
ctx->gchead …Run Code Online (Sandbox Code Playgroud)