V8 Tracing
Secara umum, ray tracing adalah metode untuk menentukan jalur partikel melalui sistem koordinat. Dalam SpongeAPI, ini diimplementasikan dengan: javadoc: BlockRay kelas untuk menemukan blok di jalur yang sewenang-wenang di ruang angkasa. Kasus penggunaan yang umum adalah menemukan blok yang: javadoc: Player sedang melihat.
Anda dapat menentukan asal sinar menggunakan metode `` BlockRay # from``, lewat salah satu dari: javadoc: Location, an: javadoc:` Extent` dan `` Vector3d``, atau javadoc: javadoc: Entitas. Metode ini akan mengembalikan sebuah: javadoc: BlockRay.BlockRayBuilder.
Tip
Jika Anda menentukan asal sinar untuk menjadi `` Entitas``, arah standar akan menjadi arah dimana Entitas `` sedang menunjuk.
To specify the end point, you can use the BlockRay.BlockRayBuilder#to(Vector3d) method, which will set both the direction and ending location. Alternatively, you can specify a direction using BlockRay.BlockRayBuilder#direction(Vector3d) and also a distance limit using BlockRay.BlockRayBuilder#distanceLimit(double).
Catatan
The default distance limit is 1000 blocks as a safeguard to prevent infinite iteration. To disable the distance
limit, use a negative value with BlockRayBuilder#distanceLimit(double)
.
Penyaringan
Filters determine what blocks are accepted by the BlockRay
. To add a filter, use the BlockRayBuilder#stopFilter
or BlockRayBuilder#skipFilter
method, passing in one or many Predicate<BlockRayHit<E>>
s (where E
extends
Extent
). The BlockRayBuilder#stopFilter
continues the ray cast when it hits a block that passes the given
filter and the BlockRayBuilder#skipFilter
skips all blocks that pass the filter. These filters can be chained
together to create a complex BlockRay
. For convenience, BlockRay
contains the following methods for common
filter use cases:
allFilter
: kembali filter menerima semua blok
onlyAirFilter
: kembali filter lewat udara
blockTypeFilter(BlockType)
: kembali filter menerima yang hanya ditentukan BlockType
continueAfterFilter(Predicate<BlockRayHit<E>>, int)
: kembali ke filter yang terus melewati filter tertentu dengan jumlah dari blok tertentu.
Tentu saja, anda juga dapat menuliskan filter``Predikat<BlockRayHit<E>>`` milik anda sendiri.
Akhirnya, memakai BlockRay.BlockRayBuilder#build() untuk menyelesaikan pendirian BlockRay
. Contoh penggunaan BlockRayBuilder
untuk mendapatkan yang pertama non-udara blok a Player
lihat contoh di bawah ini.
import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.util.blockray.BlockRay;
import org.spongepowered.api.world.World;
Player player;
BlockRay<World> blockRay = BlockRay.from(player)
.skipFilter(BlockRay.onlyAirFilter()).stopFilter(BlockRay.onlyAirFilter()).build();
We can rewrite the above to use BlockRay#skipFilter(Predicate<BlockRayHit>)
in addition to
BlockRay#stopFilter(Predicate<BlockRayHit>)
. This will skip all air blocks and stop at the first non-air block it
hits.
BlockRay<World> blockRay = BlockRay.from(player)
.skipFilter(BlockRay.onlyAirFilter()).stopFilter(BlockRay.allFilter()).build();
Mengunakan BlockRay
Semenjak BlockRay
menjalankan Iterator
, anda dapat menggunakan metode itu sebagai hasNext
dan berikutnya
(tetapi tidak menghapus
) untuk perulangan melalui BlockRayHits dihasilkan oleh BlockRay
. Tambahan lainnya, anda bisa menggunakan metode BlockRay#reset() untuk memasang kembali iterator ke lokasi permulaan. Tentu saja dari perulangan melalui BlockRayHit
s, anda juga bisa menggunakan metode BlockRay#end() untuk melacak cahaya pada blok sampai akhir pada jalan untuk memperoleh blok terakhir yang diterima oleh filter (atau tidak sama sekali jika batas blok tercapai).
Menggunakan BlockRayHit
BlockRayHit
berisi informasi tentang masing-masing ruang berpotongan dengan sinar. Ini berisi lokasi ruang, arah sinar, dari koordinat intersection dari sinar dan ruang nya, dan data lainnya yang sesuai. Berikut kode menggunakan BlockRay
dari contoh sebelumnya untuk mencetak lokasi pertama bukan ruang di depan pengguna.
import org.spongepowered.api.util.blockray.BlockRayHit;
import java.util.Optional;
BlockRay<World> blockRay = ...;
Optional<BlockRayHit<World>> hitOpt = blockRay.end();
if (hitOpt.isPresent()) {
BlockRayHit<World> hit = hitOpt.get();
System.out.println("Found " + hit.getLocation().getBlockType() + " block at "
+ hit.getLocation() + " with intersection at " + hit.getPosition());
}