Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ARKitを触りながら振り返る
Search
hira
October 11, 2022
Technology
0
840
ARKitを触りながら振り返る
iOSDC Japan 2022 After Talk LT1 スライド
hira
October 11, 2022
Tweet
Share
More Decks by hira
See All by hira
Universal Linksの挙動を知る
elu697
1
80
Other Decks in Technology
See All in Technology
rootlessコンテナのすゝめ - 研究室サーバーでもできる安全なコンテナ管理
kitsuya0828
3
390
OCI 運用監視サービス 概要
oracle4engineer
PRO
0
4.8k
安心してください、日本語使えますよ―Ubuntu日本語Remix提供休止に寄せて― 2024-11-17
nobutomurata
1
1k
アジャイルでの品質の進化 Agile in Motion vol.1/20241118 Hiroyuki Sato
shift_evolve
0
170
Why App Signing Matters for Your Android Apps - Android Bangkok Conference 2024
akexorcist
0
130
iOSチームとAndroidチームでブランチ運用が違ったので整理してます
sansantech
PRO
0
140
サイバーセキュリティと認知バイアス:対策の隙を埋める心理学的アプローチ
shumei_ito
0
390
インフラとバックエンドとフロントエンドをくまなく調べて遅いアプリを早くした件
tubone24
1
430
適材適所の技術選定 〜GraphQL・REST API・tRPC〜 / Optimal Technology Selection
kakehashi
1
670
ISUCONに強くなるかもしれない日々の過ごしかた/Findy ISUCON 2024-11-14
fujiwara3
8
870
【Startup CTO of the Year 2024 / Audience Award】アセンド取締役CTO 丹羽健
niwatakeru
0
1.2k
TypeScript、上達の瞬間
sadnessojisan
46
13k
Featured
See All Featured
Code Reviewing Like a Champion
maltzj
520
39k
Building an army of robots
kneath
302
43k
RailsConf 2023
tenderlove
29
900
Building Applications with DynamoDB
mza
90
6.1k
Fontdeck: Realign not Redesign
paulrobertlloyd
82
5.2k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
38
1.8k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
191
16k
Agile that works and the tools we love
rasmusluckow
327
21k
How GitHub (no longer) Works
holman
310
140k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
250
21k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
31
2.7k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
28
8.2k
Transcript
4BOTBOגࣜձٕࣾज़ຊ෦.PCJMF"QQMJDBUJPOάϧʔϓ ฏࢁஐݾ "3,JUΛ৮Γͳ͕ΒৼΓฦΔ 88%$ J04%$ J04%$+BQBO"GUFS5BML
ࣗݾհ w !FMV w 4BOTBOגࣜձࣾ৽ଔೖࣾ w J04ΤϯδχΞ📱 w ͖ήʔϜ🎮 ෩ܠ🏞
͓͠ͳ͕͖ "3,JUτϐοΫ 0CKFDU$BQUVSF .PUJPO$BQUVSF ͓·͚
"3,JU 88%$
w ʹ"3,JU͔ΒຖΞοϓσʔτ͕ଓ͘ w ͷJ1BE1SPʹഎ໘5SVF%FQUIΧϝϥ͕ࡌ w ͔Β1SPγϦʔζʹ-J%"3εΩϟφࡌ w νοϓͷੑೳ্͕͠ෳࡶͳ͜ͱ͕Ͱ͖ΔΑ͏ʹͳͬͨ
w ,ʹରԠ w ΧϝϥػೳڧԽ w 1MBOFBODIPSͷਫ਼্ w ϞʔγϣϯΩϟϓνϟͷੑೳ্ w -PDBUJPOBODIPSͷҬ֦େ
τϐοΫ %JTDPWFS"3,JU
w ,ʹରԠ👉ϚγϯύϫʔͰॲཧͷޮԽ w ΧϝϥػೳڧԽ👉"34FTTJPOதʹ੩ࢭըΛΩϟϓνϟՄೳʹ )%3 w 1MBOFBODIPSͷਫ਼্👉ฏ໘ೝࣝํͷਫ਼্͕ w ϞʔγϣϯΩϟϓνϟੑೳ্👉શମతͳਫ਼্ ࣖݕग़Մೳ
w -PDBUJPOBODIPSͷҬ֦େ👉Ҭ֦େͰ౦ژՃ
,ʹରԠ w ैདྷը૾Λॖখ͔ͯ͠ΒॲཧΛߦͬͯϨϯμϦϯά͍ͯͨ͠ w ,ͷը૾Λॲཧ͢ΔϝϞϦϦιʔεܭࢉೳྗෆނ w ࠷৽ͷϋʔυΣΞύϫʔ 💪 Ͱ,ॲཧ͕Ͱ͖ΔΑ͏ʹͳͬͨ
,ʹରԠ w ,ͰࡱӨ w ͰฏۉԽ͠ॖখ w NTຖʹॲཧ 㲈GQT
w ϨϯμϦϯά #FGPSF IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED
,ʹରԠ w ,ͰࡱӨ w ͰฏۉԽ͠ॖখ w NTຖʹॲཧ 㲈GQT
w ϨϯμϦϯά #FGPSF IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED
,ʹରԠ w ,ͰࡱӨ w ͰฏۉԽ͠ॖখ w NTຖʹॲཧ 㲈GQT
w ϨϯμϦϯά #FGPSF IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED
,ʹରԠ w ,ͰࡱӨ w ͰฏۉԽ͠ॖখ w NTຖʹॲཧ 㲈GQT
w ϨϯμϦϯά #FGPSF IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED
,ʹରԠ w ,ͰࡱӨ w ͰฏۉԽ͠ॖখ w NTຖʹॲཧ 㲈GQT
w ϨϯμϦϯά "GUFS ,NPEF IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED 💪
,ʹରԠ w ,ͰࡱӨ w ͰฏۉԽ͠ॖখ w NTຖʹॲཧ 㲈GQT
w ϨϯμϦϯά "GUFS ,NPEF IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED 💪
,ʹରԠ w ,ͰࡱӨ w ͰฏۉԽ͠ॖখ w NTຖʹॲཧ 㲈GQT
w ϨϯμϦϯά "GUFS ,NPEF IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED 💪
w ୯७ͳಈըͰ,GQT্͕ݶ w ЋͳॲཧΛ͢ΔͷͰGQTݶք
w ,ʹରԠ👉ϚγϯύϫʔͰॲཧͷޮԽ w ΧϝϥػೳڧԽ👉"34FTTJPOதʹ੩ࢭըΛΩϟϓνϟՄೳʹ )%3 w 1MBOFBODIPSͷਫ਼্👉ฏ໘ೝࣝํͷਫ਼্͕ w ϞʔγϣϯΩϟϓνϟੑೳ্👉શମతͳਫ਼্ ࣖݕग़Մೳ
w -PDBUJPOBODIPSͷҬ֦େ👉Ҭ֦େͰ౦ژՃ
w ,ʹରԠ👉ϚγϯύϫʔͰॲཧͷޮԽ w ΧϝϥػೳڧԽ👉"34FTTJPOதʹ੩ࢭըΛΩϟϓνϟՄೳʹ )%3 w 1MBOFBODIPSͷਫ਼্👉ฏ໘ೝࣝํͷਫ਼্͕ w ϞʔγϣϯΩϟϓνϟੑೳ্👉શମతͳਫ਼্ ࣖݕग़Մೳ
w -PDBUJPOBODIPSͷҬ֦େ👉Ҭ֦େͰ౦ژՃ
1MBOFBODIPSͷਫ਼্ w 1MBOFBODIPSʹઃఆͨ͠ΦϒδΣΫτ w ֯ɼ෯ͱߴ͞ΛೝࣝՄೳʹ IUUQTEFWFMPQFSBQQMFDPN
w ,ʹରԠ👉ϚγϯύϫʔͰॲཧͷޮԽ w ΧϝϥػೳڧԽ👉"34FTTJPOதʹ੩ࢭըΛΩϟϓνϟՄೳʹ )%3 w 1MBOFBODIPSͷਫ਼্👉ฏ໘ೝࣝํͷਫ਼্͕ w ϞʔγϣϯΩϟϓνϟੑೳ্👉શମతͳਫ਼্ ࣖݕग़Մೳ
w -PDBUJPOBODIPSͷҬ֦େ👉Ҭ֦େͰ౦ژՃ
w ,ʹରԠ👉ϚγϯύϫʔͰॲཧͷޮԽ w ΧϝϥػೳڧԽ👉"34FTTJPOதʹ੩ࢭըΛΩϟϓνϟՄೳʹ )%3 w 1MBOFBODIPSͷਫ਼্👉ฏ໘ೝࣝํͷਫ਼্͕ w ϞʔγϣϯΩϟϓνϟੑೳ্👉શମతͳਫ਼্ ࣖݕग़Մೳ
w -PDBUJPOBODIPSͷҬ֦େ👉Ҭ֦େͰ౦ژՃ
-PDBUJPOBODIPSͷҬ֦େ w 714ͱ͍͏Ґஔਪఆٕज़ w ҐஔਪఆʹۭؒͷεΩϟϯσʔλ͕ඞཁ w (14 ηϯαʔ ө૾ʹΑΓҐஔ͖ͷਪఆ w
౦ژؚΊෳͷࢢ͕Ճ͞Εͨ IUUQTEFWFMPQFSBQQMFDPN
-PDBUJPOBODIPSͷҬ֦େ w 714ͱ͍͏Ґஔਪఆٕज़ w ҐஔਪఆʹۭؒͷεΩϟϯσʔλ͕ඞཁ w (14 ηϯαʔ ө૾ʹΑΓҐஔ͖ͷਪఆ w
౦ژؚΊෳͷࢢ͕Ճ͞Εͨ IUUQTEFWFMPQFSBQQMFDPN
w ,ʹରԠ👉ϚγϯύϫʔͰॲཧͷޮԽ w ΧϝϥػೳڧԽ👉"34FTTJPOதʹ੩ࢭըΛΩϟϓνϟՄೳʹ )%3 w 1MBOFBODIPSͷਫ਼্👉ฏ໘ೝࣝํͷਫ਼্͕ w ϞʔγϣϯΩϟϓνϟੑೳ্👉શମతͳਫ਼্ ࣖݕग़Մೳ
w -PDBUJPOBODIPSͷҬ֦େ👉Ҭ֦େͰ౦ژՃ
w ,ʹରԠ👉ϚγϯύϫʔͰॲཧͷޮԽ w ΧϝϥػೳڧԽ👉"34FTTJPOதʹ੩ࢭըΛΩϟϓνϟՄೳʹ )%3 w 1MBOFBODIPSͷਫ਼্👉ฏ໘ೝࣝํͷਫ਼্͕ w ϞʔγϣϯΩϟϓνϟੑೳ্👉શମతͳਫ਼্ ࣖݕग़Մೳ
w -PDBUJPOBODIPSͷҬ֦େ👉Ҭ֦େͰ౦ژՃ
͓ͼ
XBSOJOHMJCPCKD"EZMJCJTCFJOHSFBEGSPNQSPDFTTNFNPSZ 5IJTJOEJDBUFTUIBU--%#DPVMEOPUGJOEUIFPOEJTLTIBSFE DBDIFGPSUIJTEFWJDF5IJTXJMMMJLFMZSFEVDFEFCVHHJOH QFSGPSNBODF
࣮ػσόοάΛ͠Α͏ͱ͢Δͱىಈʹd͔͔ͬͨΓ "34FTTPO్͕தͰམͪɼσϞΛ༻ҙͰ͖·ͤΜͰͨ͠
w SNSd-JCSBSZ%FWFMPQFS9DPEFJ04a%FWJDF4VQQPSU w J04CFUBͰͳ͘ϦϦʔε൛෮ݩ w 9DPEFCFUBΛআ ϦϦʔε൛ͷΈଘࡏ w 👆Ͱͳ͔ͥղܾ
0CKFDU$BQUVSF 88%$
0CKFDU$BQUVSF w 88%$Ͱ3FBMJUZLJUʹՃ w ϞϊΛෳ໘͔ΒࡱӨ w ߹ͯ̏͠%ΦϒδΣΫτΛ࡞ w ཁ݅-J%"3ࡌ J04
"Ҏ߱ w ..BDPS".%(16 IUUQTEFWFMPQFSBQQMFDPN
0CKFDU$BQUVSF "3,JUͱ3FBMJUZ,JU w "3,JUϕʔεͱͳΔϑϨʔϜϫʔΫ w εΩϟϯΦϒδΣΫτදࣔ w 3FBMJUZ,JUԾͱݱ࣮ͷ౷߹ w ΦϒδΣΫτͷૢ࡞
w ॲཧɾܭࢉ w %ϨϯμϦϯά IUUQTEFWFMPQFSBQQMFDPN
0CKFDU$BQUVSF w "QQMFͷެࣜαϯϓϧ w ༰ʜࡱӨॲཧΛݟͯΈΔ
/// - Tag: WillBeginCapture func photoOutput(_ output: AVCapturePhotoOutput, willBeginCaptureFor resolvedSettings:
AVCaptureResolvedPhotoSettings) { maxPhotoProcessingTime = resolvedSettings.photoProcessingTimeRange.start + resolvedSettings.photoProcessingTimeRange.duration } /// - Tag: WillCapturePhoto func photoOutput(_ output: AVCapturePhotoOutput, willCapturePhotoFor resolvedSettings: AVCaptureResolvedPhotoSettings) { willCapturePhotoAnimation() // Retrieve the gravity vector at capture time. if motionManager.isDeviceMotionActive { gravity = motionManager.deviceMotion?.gravity logger.log("Captured gravity vector: \(String(describing: self.gravity))") } guard let maxPhotoProcessingTime = maxPhotoProcessingTime else { return } // Show a spinner if processing time exceeds one second. let oneSecond = CMTime(seconds: 1, preferredTimescale: 1) if maxPhotoProcessingTime > oneSecond { photoProcessingHandler(true) } } ॏྗՃΛอଘ
/// - Tag: DidFinishProcessingPhoto func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo:
AVCapturePhoto, error: Error?) { photoProcessingHandler(false) if let error = error { print("Error capturing photo: \(error)") photoData = nil } else { // Cache the HEIF representation of the data. photoData = photo } // Cache the depth data, if it exists, as a disparity map. logger.log("DidFinishProcessingPhoto: photo=\(String(describing: photo))") if let depthData = photo.depthData?.converting(toDepthDataType: kCVPixelFormatType_DisparityFloat32), let colorSpace = CGColorSpace(name: CGColorSpace.linearGray) { let depthImage = CIImage( cvImageBuffer: depthData.depthDataMap, options: [ .auxiliaryDisparity: true ] ) depthMapData = context.tiffRepresentation(of: depthImage, format: .Lf, colorSpace: colorSpace, options: [.disparityImage: depthImage]) } else { logger.error("colorSpace .linearGray not available... can't save depth data!") depthMapData = nil } } ਂϚοϓΛอଘ
if let photoOutputConnection = self.photoOutput.connection(with: .video) { photoOutputConnection.videoOrientation = videoPreviewLayerOrientation
} var photoSettings = AVCapturePhotoSettings() // Request HEIF photos if supported and enable high-resolution photos. if self.photoOutput.availablePhotoCodecTypes.contains(.hevc) { photoSettings = AVCapturePhotoSettings( format: [AVVideoCodecKey: AVVideoCodecType.hevc]) } // Turn off the flash. The app relies on ambient lighting to avoid specular highlights. if self.videoDeviceInput!.device.isFlashAvailable { photoSettings.flashMode = .off } // Turn on high-resolution, depth data, and quality prioritzation mode. photoSettings.isHighResolutionPhotoEnabled = true photoSettings.isDepthDataDeliveryEnabled = self.photoOutput.isDepthDataDeliveryEnabled photoSettings.photoQualityPrioritization = self.photoQualityPrioritizationMode // Request that the camera embed a depth map into the HEIC output file. photoSettings.embedsDepthDataInPhoto = true // Specify a preview image. if !photoSettings.__availablePreviewPhotoPixelFormatTypes.isEmpty { photoSettings.previewPhotoFormat = [kCVPixelBufferPixelFormatTypeKey: photoSettings.__availablePreviewPhotoPixelFormatTypes.first!, kCVPixelBufferWidthKey: self.previewWidth, kCVPixelBufferHeightKey: self.previewHeight] as [String: Any] logger.log("Found available previewPhotoFormat: \(String(describing: photoSettings.previewPhotoFormat))") } else { logger.warning("Can't find preview photo formats! Not setting...") } // Tell the camera to embed a preview image in the output file. photoSettings.embeddedThumbnailPhotoFormat = [ AVVideoCodecKey: AVVideoCodecType.jpeg, AVVideoWidthKey: self.thumbnailWidth, AVVideoHeightKey: self.thumbnailHeight ] DispatchQueue.main.async { self.isHighQualityMode = photoSettings.isHighResolutionPhotoEnabled && photoSettings.photoQualityPrioritization == .quality } Χϝϥͱը૾ͷઃఆ
ࡱӨը૾ ਂϚοϓ ॏྗՃ 9 : ;
let inputFolderUrl = URL(fileURLWithPath: inputFolder, isDirectory: true) let configuration =
makeConfigurationFromArguments() logger.log("Using configuration: \(String(describing: configuration))") // Try to create the session, or else exit. var maybeSession: PhotogrammetrySession? = nil do { maybeSession = try PhotogrammetrySession(input: inputFolderUrl, configuration: configuration) logger.log("Successfully created session.") } catch { logger.error("Error creating session: \(String(describing: error))") Foundation.exit(1) } ϑΥϧμΛ͚ͩ͢
let entity = try! ModelEntity.load(named: "test.usdz") let anchorEntity = AnchorEntity(plane:
.any) anchorEntity.addChild(entity) arView.scene.addAnchor(anchorEntity) &OUJUZͷՃ
w ෳͷࣸਅσʔλ͔Β%ΦϒδΣΫτΛ࡞ w ղ૾ใ͕ଟ͍΄Ͳਫ਼͕ߴ͘ͳΔ w "3,JUͰ,ࡱӨ͕ରԠ͠Ͳ͏มΘͬͨʁ
let config = ARWorldTrackingConfiguration() // ͕ѻ͑Δ࠷ߴը࣭ͰͷϑΥʔϚοτΛฦ͢ if let hiResCaptureVideoFormat =
ARWorldTrackingConfiguration.recommendedVideoFormatForHighResolutionFrameCapturing { config.videoFormat = hiResCaptureVideoFormat } // 4kը࣭͕ѻ͑Δ߹ͷΈϑΥʔϚοτΛฦ͢ if let res4kCaptureVideoFormat = ARWorldTrackingConfiguration.recommendedVideoFormatFor4KResolution { config.videoFormat = res4kCaptureVideoFormat } "34FTTJPOͰͷө૾ϑΥʔϚοτ
arView.session.captureHighResolutionFrame { arFrame, error in guard let imageBuffer = arFrame?.capturedImage
else { return } let ciImage = CIImage(cvPixelBuffer: imageBuffer) let w = CGFloat(CVPixelBufferGetWidth(imageBuffer)) let h = CGFloat(CVPixelBufferGetHeight(imageBuffer)) let rect:CGRect = CGRect.init(x: 0, y: 0, width: w, height: h) let context = CIContext.init() guard let cgImage = context.createCGImage(ciImage, from: rect) else { return } let uiimage = UIImage(cgImage: cgImage).rotated(by: 90.0 * CGFloat.pi / 180) UIImageWriteToSavedPhotosAlbum(uiimage, self, nil, nil) } "34FTTJPOதͷϑϨʔϜऔಘ "34FTTJPO͕ઃఆΛΑ͠ͳʹͯ͘͠Εͯ "3,JUͷϝιουΘ͔Γ͍͢
.PUJPO$BQUVSF 88%$
.PUJPO$BQUVSF w 88%$"3,JUͰൃද͞Εͨػೳ w ࣍ݩը૾ͱ-J%"3εΩϟφΛ༻͍ͨਂใ͔Βͷ࢟ਪఆ w ਪఆ͞ΕͨؔઅͷใΛ"3"ODIPS͔ΒऔಘͰ͖Δɽ
"3"ODIPS w Ծۭ͔ؒΒݟͨݱ࣮ੈքʹ͓͚ΔΦϒδΣΫτͷҐஔ͖ w ϫʔϧυ࠲ඪܥʹ͓͚Δ࠲ඪϙΠϯτʹͳΔ
"3"ODIPSͷछྨ w "31MBOF"ODIPSݱ࣮ۭ͔ؒΒݕग़͞Εͨฏ໘ͷҐஔܗঢ়ใ w "3*NBHF"ODIPS"3ϚʔΧʔ༧Ί༻ҙ͞Εͨը૾ͷใ w "30CKFDU"ODIPSϙϦΰϯϝογϡ͔Βݕग़ͨ͠ཧతͳใ w "3#PEZ"ODIPSਓͷؔઅͷใ w
"3'BDF"ODIPSਓͷإͷύʔπ͖ͷใ w "3.FTI"ODIPS "3(FP"ODIPS "3"QQ$MJQ$PEF"ODIPSʜ
let entity = try! ModelEntity.load(named: "test.usdz") let anchorEntity = AnchorEntity(plane:
.any) anchorEntity.addChild(entity) arView.scene.addAnchor(anchorEntity) &OUJUZͷՃ
"34$/7JFX "3,JU 4DFOF,JU "34FTTJPJO "3'SBNF "3"ODIPS "37JFX 3FBMJUZ,JU 4DFOF "ODIPS&OUJUZ
.PEFM&OUJUZ "ODIPS&OUJUZ &OUJUZ &OUJUZ $PO fi HVSBUJPO "3'SBNF "3"ODIPS
"3,JU 3FBMJUZ,JU "37JFX 4DFOF "ODIPS&OUJUZ .PEFM&OUJUZ "ODIPS&OUJUZ &OUJUZ &OUJUZ "34FTTJPJO
$PO fi HVSBUJPO
.PUJPO$BQUVSF w Ͳ͏࣮ߦ͢Δͷ͔ w ͜ΕެࣜͰ༗Γl$BQUVSJOH#PEZ.PUJPOJO%z w దͳϞσϧͷ༻ҙ w "3#PEZ5SBDLJOH$PO fi
HVSBUJPOͰ"34FTTJPOΛىಈ w Ϟσϧϩʔυ
Ϟσϧͷ༻ҙ
let configuration = ARBodyTrackingConfiguration() arView.session.run(configuration) arView.scene.addAnchor(characterAnchor) if let entity =
try? Entity.loadBodyTracked(named: "character/robot") { self.character = entity } Ϟσϧͷϩʔυ 4DFOFʹϞσϧͷ"ODIPSΛઃஔ Ϟσϧͷ#PEZ5SBDLFE&OUJUZͷ༻ҙ
func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) { for anchor
in anchors { guard let bodyAnchor = anchor as? ARBodyAnchor else { continue } let bodyPosition = simd_make_float3(bodyAnchor.transform.columns.3) characterAnchor.position = bodyPosition + characterOffset characterAnchor.orientation = Transform(matrix: bodyAnchor.transform).rotation if let character = character, character.parent == nil { characterAnchor.addChild(character) } } } Ϟσϧͱ"3#PEZ"ODIPSͷଓ ϞσϧଆͰKPJOU/BNF߹Θ͍ͤͯΔͷͰɼ"ODIPSʹॏͶΔ͚ͩ
͓·͚
w ϐʔϓϧΦΫϧʔδϣϯ w 3PPN1MBO
ϐʔϓϧΦΫϧʔδϣϯ w ਂใ͔ΒਓͷલޙؔΛೝࣝ w "38PSME5SBDLJOH$PO fi HVSBUJPO w DPO
fi HGSBNF4FNBOUJDT<QFSTPO4FHNFOUBUJPO8JUI%FQUI>
let cameraAnchor = AnchorEntity(.camera) self.scene.addAnchor(cameraAnchor) cameraAnchor.addChild(background) background.position = [0,0,-5] എܠΛۭؒͷNޙΖʹઃஔ
ਓͷલޙҐஔΛೝ͍ࣝͯ͠ΔͷͰɼ ਓ͕̑NޙΖʹ͕͞Δͱਓ͕ӅΕΔ
w ;PPNͷഎܠكʹޙΖͷՈ۩͕ࣸΓࠐΜͩΓ͢Δ w ਓͷલޙҐஔΛೝࣝͰ͖Δͨͩը૾͔Βͷਓநग़Ͱͳ͍ w ࠓճͷ88%$ͰJ1IPOFΛΣϒΧϝϥʹ͢ΔτϐοΫ͋Γ w Ξοϓσʔτʹظ
3PPN1MBO w "3,JUΛར༻ͯ͠Χϝϥͱ-J%"3Λར༻ͨ͠ϑϩΞϚοϐϯά͕Մೳ w ڪΖ͘͠؆୯ͳίʔυͰ෦ͷ%औΓਤ͕࡞Մೳ w "QQMFͷαϯϓϧ͕ར༻Մೳ w l$SFBUFB%NPEFMPGBOJOUFSJPSSPPNCZHVJEJOHUIFVTFSUISPVHI BO"3FYQFSJFODFz
let roomCaptureView = RoomCaptureView(frame: view.frame) view.addSubview(roomCaptureView) roomCaptureView.captureSession.run(configuration: .init()) roomCaptureView.captureSession.stop() %FMFHBUFͰྃ࣌ʹ෦ͷΩϟϓνϟʔσʔλ͕ड͚औΕΔ
"3,JU·ͱΊ w ػೳ͕ॆ࣮͠؆୯ͳࣄͰ͋Ε༻ҙʹࢼͤΔڥʹͳ͖ͬͯͨ w 75VCFSJ1IPOFΛͬͯΩϟϥΫλʔϞσϧΛಈ͔ͤΔ෯͕͕ͬͨ w ͨͩࢼ͚ͩ͢Ͱਫ਼͕ߴ͍ͷͰ݁ߏΫΦϦςΟߴ͘ײָ͍ͯ͡͠ ͥͻ"3,JUΛ৮ͬͨ͜ͱແ͍ํ৮ΕͯΈ͍ͯͩ͘͞ʂ
5IBOLT