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 BlockRayHits, 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());
}