当它在另一个对象中时,如何隐藏THREE.PlaneBufferGeometry的一部分?

时间:2015-09-18 18:48:49

标签: javascript three.js

我有一个由THREE.PlaneBufferGeometry(水面)制成的网格,在那个表面上是另一个物体(船)。我的问题是,当船稍微进入水中时,你会看到水突然出现在船内(因为y值较高)。

我该如何解决这个问题?

我正在考虑计算船内部的尺寸并试图将它们传递到水面的着色器。 (如果该点位于内部,则隐藏它。)这是最好的方法吗?我怎么能这样做?

编辑:水应该与船的两侧重叠(例如,在前面示出)。要澄清:

  Current situation:            Desired situation:

B        A
     |         |                  |         |
-----|---------|--------     -----|         |--------
     |_________|                  |_________|

从[A]你不应该看到船体内的水,而且[B]你不应该看到船的下部。

1 个答案:

答案 0 :(得分:1)

尝试禁用水面的深度书写。检查以下示例。让我们说蓝色平原是水,红色是船。

import numpy as np
import pyopencl as cl
import pyopencl.array
ctx = cl.create_some_context()
queue = cl.CommandQueue(ctx)

m, n = 5, 5
A = np.random.uniform(size=(m, n)).astype(np.float32)
clA = cl.array.Array(queue, A.shape, A.dtype)
clA.set(A)

clV = clA[1::2, 1::2]

def data(array):
    if array.offset:
        return array.base_data.get_sub_region(array.offset, 1)
    else:
        return array.data

source = """
__kernel void fn(long si, long sj, __global float *Y)
{
    const int i = get_global_id(0);
    const int j = get_global_id(1);
    Y[i*si + j*sj] = 3;
}
"""
kernel = cl.Program(ctx, source).build().fn
gsize = clV.shape
lsize = None

estrides = np.array(clV.strides) / clV.dtype.itemsize
kernel(queue, gsize, lsize, estrides[0], estrides[1], data_ptr(clV))

print(clA.get())