本文整理汇总了C#中Ray.getMin方法的典型用法代码示例。如果您正苦于以下问题:C# Ray.getMin方法的具体用法?C# Ray.getMin怎么用?C# Ray.getMin使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Ray
的用法示例。
在下文中一共展示了Ray.getMin方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: intersectFlake
private void intersectFlake(Ray r, IntersectionState state, int level, float qa, float qaInv, float cx, float cy, float cz, float dx, float dy, float dz, float radius)
{
if (level <= 0) {
// we reached the bottom - intersect sphere and bail out
float vcx = cx - r.ox;
float vcy = cy - r.oy;
float vcz = cz - r.oz;
float b = r.dx * vcx + r.dy * vcy + r.dz * vcz;
float disc = b * b - qa * ((vcx * vcx + vcy * vcy + vcz * vcz) - radius * radius);
if (disc > 0) {
// intersects - check t values
float d = (float) Math.Sqrt(disc);
float t1 = (b - d) * qaInv;
float t2 = (b + d) * qaInv;
if (t1 >= r.getMax() || t2 <= r.getMin())
return;
if (t1 > r.getMin())
r.setMax(t1);
else
r.setMax(t2);
state.setIntersection(0, cx, cy, cz);
}
} else {
float boundRadius = radius * (1 + boundingRadiusOffset[level]);
float vcx = cx - r.ox;
float vcy = cy - r.oy;
float vcz = cz - r.oz;
float b = r.dx * vcx + r.dy * vcy + r.dz * vcz;
float vcd = (vcx * vcx + vcy * vcy + vcz * vcz);
float disc = b * b - qa * (vcd - boundRadius * boundRadius);
if (disc > 0) {
// intersects - check t values
float d = (float) Math.Sqrt(disc);
float t1 = (b - d) * qaInv;
float t2 = (b + d) * qaInv;
if (t1 >= r.getMax() || t2 <= r.getMin())
return;
// we hit the bounds, now compute intersection with the actual
// leaf sphere
disc = b * b - qa * (vcd - radius * radius);
if (disc > 0) {
d = (float) Math.Sqrt(disc);
t1 = (b - d) * qaInv;
t2 = (b + d) * qaInv;
if (t1 >= r.getMax() || t2 <= r.getMin()) {
// no hit
} else {
if (t1 > r.getMin())
r.setMax(t1);
else
r.setMax(t2);
state.setIntersection(0, cx, cy, cz);
}
}
// recursively intersect 9 other spheres
// step1: compute basis around displacement vector
float b1x, b1y, b1z;
if (dx * dx < dy * dy && dx * dx < dz * dz) {
b1x = 0;
b1y = dz;
b1z = -dy;
}
else if (dy * dy < dz * dz)
{
b1x = dz;
b1y = 0;
b1z = -dx;
}
else
{
b1x = dy;
b1y = -dx;
b1z = 0;
}
float n = 1 / (float) Math.Sqrt(b1x * b1x + b1y * b1y + b1z * b1z);
b1x *= n;
b1y *= n;
b1z *= n;
float b2x = dy * b1z - dz * b1y;
float b2y = dz * b1x - dx * b1z;
float b2z = dx * b1y - dy * b1x;
b1x = dy * b2z - dz * b2y;
b1y = dz * b2x - dx * b2z;
b1z = dx * b2y - dy * b2x;
// step2: generate 9 children recursively
float nr = radius * (1 / 3.0f), scale = radius + nr;
for (int i = 0; i < 9 * 3; i += 3) {
// transform by basis
float ndx = recursivePattern[i] * dx + recursivePattern[i + 1] * b1x + recursivePattern[i + 2] * b2x;
float ndy = recursivePattern[i] * dy + recursivePattern[i + 1] * b1y + recursivePattern[i + 2] * b2y;
float ndz = recursivePattern[i] * dz + recursivePattern[i + 1] * b1z + recursivePattern[i + 2] * b2z;
// recurse !
intersectFlake(r, state, level - 1, qa, qaInv, cx + scale * ndx, cy + scale * ndy, cz + scale * ndz, ndx, ndy, ndz, nr);
}
}
}
}