hus*_*sik 11 java 3d java-3d shadow
假设您的眼睛位于物体A上的表面点P1并且存在目标物体B并且物体B后面存在点光源.
问题:如果我看到光源并说"我在阴影中",如果由于物体B我看不到光线,我是对的吗?然后我将对象A的那个点标记为"A上的B的阴影点之一".

如果这是真的,那么我们可以在A的表面上建立一个"阴影几何"(黑色)对象,然后由于光,B,A等的运动实时地改变它吗?让我们说球体(A)有1000个顶点而其他球体(B)也有1000个顶点,那么这意味着1个百万的比较吗?(是阴影,O(N ^ 2)(时间)复杂性?).我不确定复杂性,因为改变P1(眼睛)也会改变B的观察点(P1和光源点之间).那么二阶阴影和更高的阴影(例如两次物体之间多次反射的光线)?
我现在使用的是java-3D,但它没有阴影功能,所以我想转移到其他兼容java的库.
谢谢.
编辑:我需要在移动相机时禁用"相机"来构建阴影.我怎样才能做到这一点?这会严重降低性能吗?
新思路: java3D具有内置的碰撞检测功能.我将创建从光到目标多边形顶点的线(不可见),然后检查来自另一个对象的碰撞.如果发生冲突,请添加该顶点corrd.到阴影列表,但这只适用于点光源:(.
任何为java3d提供真正的阴影库的人都会非常有帮助.
java3D中非常小的样本Geomlib阴影/光线跟踪可能是最好的 Ray跟踪示例吗?
我知道这有点难,但至少有一百人可以试过.
谢谢.
您的方法可以总结如下:
foreach (point p to be shaded) {
foreach (light) {
if (light is visible from p)
// p is lit by that light
else
// p is in shadow
}
}
Run Code Online (Sandbox Code Playgroud)
有趣的是,这就是当今 GPU 上实时阴影的实现方式。
然而,要使其高效工作并非易事。渲染场景是一个逐个三角形的简化过程。如果对于每个三角形中的每个点(像素、片段),您需要考虑其他三角形中的所有其他三角形来检查光线相交,那将非常麻烦。
那么如何高效地做到这一点呢?答案:相反的过程。
通常,场景中的灯光比像素少得多。让我们利用这一事实并进行一些预处理:
// preprocess
foreach (light) {
// find all pixels p on the scene reachable from the light
}
// then render the whole scene...
foreach (point p to be shaded) {
foreach (light) {
// simply look up into what was calculated before...
if (p is visible by the light)
// p is lit
else
// p is in shadow
}
}
Run Code Online (Sandbox Code Playgroud)
这看起来快了很多......但仍然存在两个问题:
这是棘手的部分:
这种技术称为“阴影贴图”,具有从光源可见的像素的纹理称为“阴影贴图”。有关更详细的解释,请参阅Wikipedia 文章等。