AR 3D object placement on plane

NOVASOLUTIONS.TECHNOLOGY is engaged in the development, support and maintenance of iOS, Android, PWA mobile applications. We have extensive experience and expertise in publishing mobile applications in popular markets like Google Play, App Store, Amazon, AppGallery and others.
Development and support of all types of mobile applications:
Information and entertainment mobile applications
News apps, games, reference guides, online catalogs, weather apps, fitness and health apps, travel apps, educational apps, social networks and messengers, quizzes, blogs and podcasts, forums, aggregators
E-commerce mobile applications
Online stores, B2B apps, marketplaces, online exchanges, cashback services, exchanges, dropshipping platforms, loyalty programs, food and goods delivery, payment systems.
Business process management mobile applications
CRM systems, ERP systems, project management, sales team tools, financial management, production management, logistics and delivery management, HR management, data monitoring systems
Electronic services mobile applications
Classified ads platforms, online schools, online cinemas, electronic service platforms, cashback platforms, video hosting, thematic portals, online booking and scheduling platforms, online trading platforms

These are just some of the types of mobile applications we work with, and each of them may have its own specific features and functionality, tailored to the specific needs and goals of the client.

Showing 1 of 1 servicesAll 1735 services
AR 3D object placement on plane
Medium
~2-3 business days
FAQ
Our competencies:
Development stages
Latest works
  • image_mobile-applications_feedme_467_0.webp
    Development of a mobile application for FEEDME
    756
  • image_mobile-applications_xoomer_471_0.webp
    Development of a mobile application for XOOMER
    624
  • image_mobile-applications_rhl_428_0.webp
    Development of a mobile application for RHL
    1054
  • image_mobile-applications_zippy_411_0.webp
    Development of a mobile application for ZIPPY
    947
  • image_mobile-applications_affhome_429_0.webp
    Development of a mobile application for Affhome
    862
  • image_mobile-applications_flavors_409_0.webp
    Development of a mobile application for the FLAVORS company
    445

Implementing AR Placement of 3D Objects on Plane

Putting a 3D model on detected plane — not an evening task if production stability matters. Object should sit level when camera moves, not "swim" with lighting change, scale reasonably, not sink into surface by 5 centimeters. Each of these — separate technical question.

3D Model Formats and Optimization for AR

Mobile AR standard — USDZ (iOS/RealityKit) and GLB/GLTF (ARCore/cross-platform). Typical mistake: take model from Blender or 3ds Max unoptimized and try loading in AR. 500k triangles polygon count, 4096×4096 textures without mip-mapping — guaranteed FPS collapse on iPhone 12 and lower.

Target parameters for mobile AR:

Object Type Polygons Textures GLB Size
Small item (chair, lamp) up to 30k 1024×1024 up to 5 MB
Medium object (sofa, table) up to 80k 2048×2048 up to 15 MB
Large (furniture set, kitchen) up to 200k 2048×2048 up to 40 MB

Compression: KTX2 + Basis Universal for GLB, HEIC textures in USDZ. In RealityKit — Reality Composer Pro (Xcode 15+) for baking physical PBR materials straight into .reality format.

Anchor, Raycast, and Why hitTest is Outdated

In ARKit 4+ and ARCore 1.18+, preferred way to determine placement point — Raycast, not deprecated hitTest. Difference is substantial:

ARSession.raycast(from:allowing:alignment:) returns list of ARRaycastResult with target: .estimatedPlane or .existingPlaneGeometry. existingPlaneGeometry more accurate — uses geometry of already-detected plane. estimatedPlane works where plane not yet fixed.

guard let query = arView.makeRaycastQuery(
    from: arView.center,
    allowing: .existingPlaneGeometry,
    alignment: .horizontal
) else { return }

let results = arView.session.raycast(query)
if let first = results.first {
    placeEntity(at: first.worldTransform)
}

For ARCore — Frame.hitTest() still documented, but Session.createRaycastQuery() + Frame.raycast() gives more stable result at plane edges.

Stabilizing Object Position

After first placement, object shouldn't "walk" when camera moves. Standard approach — anchoring to AnchorEntity:

let anchor = ARAnchor(transform: worldTransform)
arView.session.add(anchor: anchor)

let anchorEntity = AnchorEntity(anchor: anchor)
anchorEntity.addChild(modelEntity)
arView.scene.addAnchor(anchorEntity)

Without explicit ARAnchor, object continues updating position with plane updates. Especially noticeable first 10-15 seconds when ARKit actively refines plane geometry.

Shadows and Physical Lighting

AR object without shadow looks "flying". RealityKit renders contact shadow automatically for .castsShadow = true. In SceneKit — SCNLight of type .ambient + directional light with castsShadow = true.

ARKit Environment Texturing (available A12+): ARWorldTrackingConfiguration.environmentTexturing = .automatic — ARKit builds environment map from camera and applies to PBR materials. Metal and glossy surfaces start reflecting real environment. Without this, chrome item looks plastic.

Moving and Rotating After Placement

Drag gesture to move object — via ARView.installGestures(.translation, for: entity) in RealityKit. For custom behavior — UILongPressGestureRecognizer + continuous raycast during finger movement.

Rotation around vertical axis — ARView.installGestures(.rotation, for: entity) or manual via UIPanGestureRecognizer with simd_quatf(angle:axis:). Must limit rotation axis to Y only — else object starts "tilting" on imprecise gesture.

Timeline

Basic single-object placement with raycast, anchor, shadow — 4-6 days. Multi-object placement, move/rotate, multiple model format support — 10-15 days. Cost calculated individually.