我正在为 iPad 编写光线追踪器。现在我正在尝试为对象添加光泽反射。我该如何实施?我在网上阅读了一些文档:
http://www.cs.cmu.edu/afs/cs/academic/class/15462-s09/www/lec/13/lec13.pdf http://www.cs.cornell.edu/courses/cs4620/2012fa /讲座/37raytracing.pdf
如果我理解正确而不是像标准反射那样跟踪单条光线,我必须在随机方向上跟踪 n 条光线。我如何为每条射线获得这个随机方向?我如何生成这些样本?
所以我回来了另一个光线追踪问题.我的代码渲染球体都很好,花花公子,但立方体并没有真正起作用.我正在使用此代码来测试交叉点:http://pastebin.com/qgm6vpdx(这是一个递归函数,t是到交点的距离)边界框定义为:
Cube* c1 = new Cube;
c1->Corner1 = Vec3(100, 100, 100);
c1->Corner2 = Vec3(200, 200, 200);
Run Code Online (Sandbox Code Playgroud)
我已经确认相机不在立方体内.现在,唯一的问题是整个屏幕显示为绿色(指定给立方体的颜色)
我不认为我正在做正确的立方体交叉点,任何人都可以证明我的代码?
我想在3d世界中实现盒子选择.基本上,单击,按住鼠标,然后取消鼠标,获取一个框,然后选择框.首先,我想弄清楚如何获得3d中点击的坐标.
我有raypicking,那是没有得到正确的坐标(得到起源和方向).无论屏幕的X/Y是什么(尽管方向不同),它都会保持返回相同的原点.
我也尝试过:
D3DXVECTOR3 ori = D3DXVECTOR3(sx, sy, 0.0f);
D3DXVECTOR3 out;
D3DXVec3Unproject(&out, &ori, &viewPort, &projectionMat, &viewMat, &worldMat);
Run Code Online (Sandbox Code Playgroud)
它得到了同样的东西,无论坐标是什么,坐标都非常接近(并且是错误的).这几乎就像是回归眼睛,而不是真实的世界坐标.
如何使用directx 9c将2D屏幕坐标转换为3d?
我正在一个haskell程序中实现CSG.当我在OOP lahguage中做到这一点时,我受到了复合赞助人的启发.
我有一个抽象类"对象",一些具体对象(球体,平面等),以及一个具体的类"CompositeObject",其中包含一个运算符和两个指向Object的指针.
为了在Haskell中以这种方式实现CSG树,我正在考虑递归数据类型:
data Shape = Sphere (..some types here..)
| ..other primitive objects..
| Composite Shape Op Shape
Run Code Online (Sandbox Code Playgroud)
然后我通过模式匹配在对象上定义函数.这里的问题是所有对象都必须在此模块中.所有物体都集中在整体中.
我认为有一个对象的类型类是一个好主意:
class Shape a where
intersection :: Ray -> a -> [Points]
normal :: Point -> a -> Vector
...
Run Code Online (Sandbox Code Playgroud)
现在我为Sphere,plane,cilinder等定义实例.
但复合对象呢?如何创建一个由两种类型构造的类型,类函数取决于构造函数,或类似的东西?
haskell functional-programming raytracing typeclass algebraic-data-types
本质上,发生的情况是我的光线追踪器渲染的 3D 立方体出现了一些奇怪的扭曲,随着相机向上移动,这种扭曲会继续恶化,即使立方体位于屏幕上的同一位置。
代码位于http://pastebin.com/HucgjRtx
这是输出的图片:
http://postimg.org/image/5rnfrlkej/
编辑:问题解决了,因为我只是错误地计算了向量的角度。我发现的最好方法是根据 FOV (Z) 当前像素 X 和当前像素 Y 创建一个向量,然后对该向量进行归一化。
我目前正在一个周末通过光线追踪来熟悉 Rust。添加介电材料(玻璃)让我有些头痛:我的折射没有上下翻转!

这是我用于 Vector 结构的代码:
impl Vec3 {
pub fn new(x: f64, y: f64, z: f64) -> Vec3 { Vec3 {x, y, z} }
pub fn x(&self) -> f64 { self.x }
pub fn y(&self) -> f64 { self.y }
pub fn z(&self) -> f64 { self.z }
pub fn length_squared(&self) -> f64 {
self.x * self.x + self.y * self.y + self.z * self.z
}
pub fn length(&self) -> f64 { self.distance(&Vec3::default()) }
pub fn unit_vector(&self) -> …Run Code Online (Sandbox Code Playgroud) 正如您所看到的,球体有一些黑点并且不光滑。知道这个错误可能来自哪里吗?
计算颜色,在这里我创建了所有光线的反弹。我将 epsilon 应用于光线:
vec3 ComputeColor(const Ray& ray, const world& scene, int depth, float pH, float pW) {
if (depth > scene.maxDepth)
return vec3(0.0f);
const Object* hitObject;
vec3 hitPoint;
if (!Intersection(ray, scene, hitObject, &hitPoint))
return vec3(0.0f);
vec3 color = hitObject->materials.ambient + hitObject->materials.emission;
for (const PointLightSource& light : scene.lights) {
Ray lightRay;
if (light.type == PointLightSource::point) {
lightRay = Ray(light.pos, glm::normalize(hitPoint - light.pos));
}
else {
lightRay = Ray(light.pos,glm::normalize(- lightRay.direction));
}
const float epsilon = 1e-4;
lightRay.o = lightRay.o …Run Code Online (Sandbox Code Playgroud) 我正在写一个光线跟踪器作为我的完整3D引擎的一部分.我打算使用javascript作为脚本语言而不是编写自己的脚本语言.问题是我该如何使用它?顺便说一下,光线跟踪器和UI是用C#编写的.