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