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.

Untuk menentukan titik akhir, Anda dapat menggunakan metode: javadoc: BlockRay.BlockRayBuilder # to (Vector3d), yang akan mengatur arah dan lokasi akhir. Sebagai alternatif, Anda dapat menentukan arah dengan menggunakan: javadoc: BlockRay.BlockRayBuilder # direction (Vector3d) dan juga batas blok menggunakan: javadoc: BlockRay.BlockRayBuilder # blockLimit (int).

Catatan

Batas blok yang default adalah 1000 blok sebagai sebuah pengaman untuk menghalangi perulangan tidak terbatas. Untuk mematikan batas blok, menggunakan sebuah nilai negatif pada BlockRayBuilder#blockLimit(int).

Penyaringan

Filter menentukan ruang apa yang diterima oleh BlockRay. Untuk menambahkan filter, gunakan BlockRayBuilder#filter metode, lewat di satu atau banyak Predicate<BlockRayHit<E>>s (where E extends Extent). Untuk kenyamanan, BlockRay berisi metode berikut untuk umum filter menggunakan kasus:

  • allFilter: kembali filter menerima semua blok
  • onlyAirFilter: kembali filter lewat udara
  • blockTypeFilter(BlockType): kembali filter menerima yang hanya ditentukan BlockType
  • maxDistanceFilter(Vector3d, double): kembali filter yang terhenti pada waktu tertentu dari yang diberikan Vector3d
  • 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)
    .filter(BlockRay.continueAfterFilter(BlockRay.onlyAirFilter(), 1)).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());
}