Öğe oluşturma, kontrol etme ve yönetme

Jetpack XR SDK, Jetpack SceneCore'u kullanarak Entity gibi 3D modeller, stereoskopik video ve PanelEntity örnekleri oluşturmanıza, kontrol etmenize ve yönetmenize olanak tanır.

Jetpack SceneCore, 3D geliştirmeyi desteklemek için iki yaygın mimari kalıbı kullanır: sahne grafiği ve varlık-bileşen sistemi (ECS).

Varlıkları oluşturmak ve kontrol etmek için sahne grafiğini kullanma

3D uzayda nesneler oluşturmak ve bunları kontrol etmek için Jetpack SceneCore'un Session API'sini kullanarak sahne grafiğine erişebilirsiniz. Sahne grafiği, kullanıcının gerçek dünyasıyla uyumludur ve paneller ile 3D modeller gibi 3D öğeleri hiyerarşik bir yapıda düzenlemenize ve bu öğelerin durumunu korumanıza olanak tanır.

Sahne grafiğine erişim kazandıktan sonra, sahne grafiğinde uzamsal kullanıcı arayüzü (ör. SpatialPanel ve Orbiter örnekleri) oluşturmak için Jetpack Compose for XR'daki API'leri kullanabilirsiniz. 3D modeller gibi 3D içeriklerde oturuma doğrudan erişebilirsiniz. Daha fazla bilgi için bu sayfadaki ActivitySpace hakkında bölümüne bakın.

Varlık bileşen sistemi

Bir varlık-bileşen sistemi, kalıtım yerine kompozisyon ilkesini izler. Davranış tanımlayan bileşenler ekleyerek varlıkların davranışını genişletebilirsiniz. Bu sayede, aynı davranışı farklı türlerdeki varlıklara uygulayabilirsiniz. Daha fazla bilgi için bu sayfadaki Varlıklara ortak davranış ekleme bölümüne bakın.

ActivitySpace hakkında

Her Session, Session ile otomatik olarak oluşturulan bir ActivitySpace içerir. ActivitySpace, sahne grafiğindeki en üst düzey Entity'dir.

ActivitySpace, sağ el koordinat sistemine sahip (x ekseni sağa, y ekseni yukarı, z ekseni ise başlangıç noktasına göre geriye doğru yönlendirir) ve gerçek dünyayla eşleşen birimler için metre kullanan 3 boyutlu bir alanı temsil eder. ActivitySpace için başlangıç noktası biraz rastgeledir (kullanıcılar ActivitySpace konumunu gerçek dünyada sıfırlayabilir). Bu nedenle, içeriği başlangıç noktasına göre değil, birbirine göre konumlandırmanız önerilir.

Varlıklarla çalışma

Varlıklar, SceneCore'un temelini oluşturur. Kullanıcının gördüğü ve etkileşimde bulunduğu neredeyse her şey panelleri, 3D modelleri ve daha fazlasını temsil eden öğelerdir.

ActivitySpace, sahne grafiğinin üst düzey düğümü olduğundan varsayılan olarak tüm yeni öğeler doğrudan ActivitySpace içine yerleştirilir. setParent() veya addChild()'ı çağırarak varlıkları sahne grafiği boyunca yeniden konumlandırabilirsiniz.

Öğelerin konumunu, dönüşünü veya görünürlüğünü değiştirmek gibi tüm öğeler için geçerli olan bazı varsayılan davranışları vardır. Entity gibi belirli GltfModelEntity alt sınıfları, alt sınıfı destekleyen ek davranışlara sahiptir.

Öğeleri değiştirme

EntityTemel Entity sınıfına ait bir özellikte değişiklik yaptığınızda bu değişiklik, tüm alt öğelere yansıtılır. Örneğin, bir üst öğenin Pose ayarlandığında tüm alt öğeleri aynı şekilde ayarlanır.Entity Bir alt kuruluş biriminde yapılan değişiklikler üst kuruluş birimini etkilemez.Entity

Pose, öğenin 3D uzaydaki konumunu ve dönüşünü gösterir. Konum, x, y, z sayısal konumlarından oluşan bir Vector3'dir. Dönüş Quaternion ile gösterilir. Bir Entity öğesinin konumu her zaman üst öğesine göre belirlenir. Diğer bir deyişle, konumu (0, 0, 0) olan bir Entity, üst öğesinin başlangıç noktasına yerleştirilir.

// Place the entity forward 2 meters
val newPosition = Vector3(0f, 0f, -2f)
// Rotate the entity by 180 degrees on the up axis (upside-down)
val newOrientation = Quaternion.fromEulerAngles(0f, 0f, 180f)
// Update the position and rotation on the entity
entity.setPose(Pose(newPosition, newOrientation))

Bir Entity öğesinin görünürlüğünü değiştirmek için setHidden() simgesini kullanın.

// Hide the entity
entity.setHidden(true)

Entity şeklini genel şeklini koruyarak yeniden boyutlandırmak için setScale() simgesini kullanın.

// Double the size of the entity
entity.setScale(2f)

Varlıklara ortak davranış ekleme

Aşağıdaki bileşenleri kullanarak varlıklara ortak davranışlar ekleyebilirsiniz:

  • MovableComponent: Kullanıcının öğeleri taşımasına olanak tanır.
  • ResizableComponent: Kullanıcının, tutarlı kullanıcı arayüzü desenleriyle öğeleri yeniden boyutlandırmasına olanak tanır.
  • InteractableComponent: Özel etkileşimler için giriş etkinliklerini yakalamanıza olanak tanır.

Bileşenlerin oluşturulması, Session sınıfındaki uygun oluşturma yöntemiyle yapılmalıdır. Örneğin, ResizableComponent oluşturmak için ResizableComponent.create()'ı arayın.

Belirli bileşen davranışını bir Entity öğesine eklemek için addComponent() yöntemini kullanın.

Bir varlığı kullanıcı tarafından taşınabilir hale getirmek için MovableComponent kullanma

MovableComponent, Entity öğesinin kullanıcı tarafından taşınmasına olanak tanır. Ayrıca öğenin yatay veya dikey yüzeyler gibi bir yüzey türüne ya da masa, duvar veya tavan gibi belirli semantik yüzeylere sabitlenip sabitlenemeyeceğini de belirtebilirsiniz. Sabitleme seçeneklerini belirtmek için MovableComponent oluştururken bir dizi AnchorPlacement belirtin.

Herhangi bir dikey yüzeye ve yalnızca zemin ile tavan gibi yatay yüzeylere taşınıp sabitlenebilen bir öğe örneğini burada bulabilirsiniz.

val anchorPlacement = AnchorPlacement.createForPlanes(
    planeTypeFilter = setOf(PlaneSemantic.FLOOR, PlaneSemantic.TABLE),
    planeSemanticFilter = setOf(PlaneType.VERTICAL)
)

val movableComponent = MovableComponent.create(
    session = session,
    systemMovable = false,
    scaleInZ = false,
    anchorPlacement = setOf(anchorPlacement)
)
entity.addComponent(movableComponent)

Kullanıcı öğeyi hareket ettirdikçe scaleInZ parametresi, öğenin ölçeğini kullanıcıdan uzaklaştıkça otomatik olarak ayarlar. Bu, ev alanında panellerin sistem tarafından ölçeklenmesine benzer. Varlık bileşeni sisteminin "basamaklı" yapısı nedeniyle üst öğenin ölçeği, alt öğelerinin tümünü etkiler.

ResizableComponent kullanarak bir Varlığı yeniden boyutlandırılabilir hale getirme

ResizableComponent, kullanıcıların Entity boyutunu değiştirmesine olanak tanır. ResizableComponent, kullanıcıyı Entity boyutunu değiştirmeye davet eden görsel etkileşim ipuçları içerir. ResizableComponent oluştururken minimum veya maksimum boyut (metre cinsinden) belirtebilirsiniz. Yeniden boyutlandırma sırasında sabit bir en boy oranı belirterek genişlik ve yüksekliğin birbirleriyle orantılı olarak yeniden boyutlandırılmasını da sağlayabilirsiniz.

ResizableComponent kullanırken onResizeUpdate veya onResizeEnd gibi belirli yeniden boyutlandırma etkinliklerine yanıt vermek için ResizeListener belirtmeniz gerekir.

ResizableComponent öğesini SurfaceEntity üzerinde sabit en boy oranıyla kullanma örneğini aşağıda bulabilirsiniz:

val resizableComponent = ResizableComponent.create(session)
resizableComponent.minimumSize = Dimensions(177f, 100f, 1f)
resizableComponent.fixedAspectRatio = 16f / 9f // Specify a 16:9 aspect ratio

resizableComponent.addResizeListener(
    executor,
    object : ResizeListener {
        override fun onResizeEnd(entity: Entity, finalSize: Dimensions) {

            // update the size in the component
            resizableComponent.size = finalSize

            // update the Entity to reflect the new size
            (entity as SurfaceEntity).canvasShape = SurfaceEntity.CanvasShape.Quad(finalSize.width, finalSize.height)
        }
    },
)

entity.addComponent(resizableComponent)

Kullanıcı girişi etkinliklerini yakalamak için InteractableComponent kullanın

InteractableComponent, kullanıcının giriş etkinliklerini (ör. kullanıcının bir Entity ile etkileşime girdiği veya imleci Entity'ın üzerine getirdiği zaman) yakalamanıza olanak tanır. InteractableComponent oluştururken giriş etkinliklerini almak için bir InputEventListener belirtmeniz gerekir. Kullanıcı herhangi bir giriş işlemi yaptığında onInputEvent yöntemi, InputEvent parametresinde sağlanan giriş bilgileriyle birlikte çağrılır.

Tüm InputEvent sabitlerinin tam listesi için referans belgelerine bakın.

Aşağıdaki kod snippet'inde, sağ elle bir öğenin boyutunu büyütmek ve sol elle küçültmek için InteractableComponent kullanma örneği gösterilmektedir.

val executor = Executors.newSingleThreadExecutor()
val interactableComponent = InteractableComponent.create(session, executor) {
    // when the user disengages with the entity with their hands
    if (it.source == InputEvent.SOURCE_HANDS && it.action == InputEvent.ACTION_UP) {
        // increase size with right hand and decrease with left
        if (it.pointerType == InputEvent.POINTER_TYPE_RIGHT) {
            entity.setScale(1.5f)
        } else if (it.pointerType == InputEvent.POINTER_TYPE_LEFT) {
            entity.setScale(0.5f)
        }
    }
}
entity.addComponent(interactableComponent)