前提・実現したいこと
Pyhtonistaのobjc_utilからSceneKit、ARKitを使って文字列をARとして表示させたいと考えています。
具体的には、ワールド座標系で絶対位置を指定し、その地点に固定させて文字列を表示させたいです。
サンプルコードを書き換え、自分の使いたいものが出せないか試しているところです。
発生している問題・エラーメッセージ
何故かNode.setPosition_メソッドを使う際にcm単位でしか指定ができず、カメラからの相対位置が固定された状態で表示されてしまいます。 カメラを動かすと表示させたい文字列も動いてしまい、使い物にならない状態です。
該当のソースコード
Pythonista3
1from objc_util import * 2import ui 3 4load_framework('SceneKit') 5load_framework('ARKit') 6 7SCNScene=ObjCClass('SCNScene') 8SCNView=ObjCClass('SCNView') 9SCNNode=ObjCClass('SCNNode') 10SCNCamera=ObjCClass('SCNCamera') 11UIColor=ObjCClass('UIColor') 12SCNText=ObjCClass('SCNText') 13SCNBox=ObjCClass('SCNBox') 14UIFont=ObjCClass('UIFont') 15 16ARWorldTrackingConfiguration=ObjCClass('ARWorldTrackingConfiguration') 17ARSCNView=ObjCClass('ARSCNView') 18ARSession=ObjCClass('ARSession') 19 20class SCNVector3(Structure): 21 _fields_=[('x', c_float),('y', c_float),('z', c_float)] 22 23class MainView(ui.View): 24 def __init__(self,*args,**kwargs): 25 self.bg_color='red' 26 f = CGRect(CGPoint(0, 0), CGSize(self.width, self.height)) 27 flex_width, flex_height = (1<<1), (1<<4) 28 29 selfIns=ObjCInstance(self) 30 31 s_view=ARSCNView.alloc().initWithFrame_options_(f, None).autorelease() 32 s_view.setAutoresizingMask_(flex_width|flex_height) 33 #s_view.delegate=selfIns 34 s_scene=SCNScene.scene() 35 s_view.scene=s_scene 36 s_view.showsStatistics=1 37 38 text_obj=SCNText.textWithString_extrusionDepth_('hello', 0.01) 39 text_obj.material().setColor_(UIColor.redColor().CGColor()) 40 bbox_min, bbox_max=SCNVector3(), SCNVector3() 41 tNode=SCNNode.nodeWithGeometry_(text_obj) 42 tNode.getBoundingBoxMin_max_(byref(bbox_min),byref(bbox_max),restype=None,argtypes=[POINTER(SCNVector3), POINTER(SCNVector3)]) 43 text_width=(bbox_max.x - bbox_min.x) 44 text_height=(bbox_max.y - bbox_min.y) 45 text_container=SCNNode.node() 46 text_container.addChildNode_(tNode) 47 tNode.setPosition_(((-text_width/2), (-text_height/2), -1)) 48 text_container.setPosition_((0, 0, -10)) 49 s_scene.rootNode().addChildNode_(text_container) 50 51 ar_cnfg = ARWorldTrackingConfiguration.new() 52 ar_session=ARSession.new() 53 ar_session.delegate=selfIns 54 ar_session.runWithConfiguration_(ar_cnfg) 55 s_view.setSession_(ar_session) 56 57 selfIns.addSubview_(s_view) 58 59v=MainView() 60v.present()
試したこと
本家Objective-CのSceneKitドキュメントにあるようにSCNVector3で位置を指定しようとしましたがエラーが出てできませんでした。
また、SCNBoxを使って試してみたところ、Boxは各辺の長さを小数で指定すると辺の長さ及びsetPositionがm単位での指定になり絶対位置が固定できることがわかりました。辺の長さを整数で指定すると辺の長さとsetPositionがcm単位での指定となってしまいカメラとの相対距離が固定され絶対位置が指定できなくなってしまいます。
SCNTextでも同様に小数指定でなんとかならないかと試してみましたが、私がやった限りではダメそうでした。
解決できるアイデアがあれば教えていただけると幸いです。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
あなたの回答
tips
プレビュー