teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

内容を少し変えました。

2021/12/28 05:19

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,91 +1,116 @@
1
1
  ARFoudationを用いて、マーカー間の中心にオブジェクトを置きたいと考えています。
2
2
  二つのマーカーを用意してそれぞれのマーカーの上にオブジェクトを乗せることはできました。
3
- private void ActivateARObject(ARTrackedImage trackedImage)の下でマーカー1と2を決めて中心点を求めオブジェクトを表示させようとしたのですが、処理が行われないという状況です。ご教示していただけると幸いです。
3
+ のソースコードでマーカー1と2を決めて中心点を求めオブジェクトを表示させようとしたのですが、処理が行われないという状況です。ご教示していただけると幸いです。
4
4
 
5
+ ```ここに言語を入力
6
+ string name = trackedImage.referenceImage.name;
7
+ if (name == "MARKER1")
8
+ {
9
+ marker1Pos = trackedImage.transform.position;
10
+ }
11
+       else if (name == "MARKER2")
12
+ {
13
+ marker2Pos = trackedImage.transform.position;
14
+ }
15
+ Vector3 center = Vector3.Lerp(marker1Pos, marker2Pos, 0.5f);
16
+ trackedImage.transform.position = center;
17
+ ```
5
18
 
19
+
20
+
21
+
22
+
23
+
24
+
6
25
  ```C#
7
26
  using System.Collections.Generic;
8
27
  using UnityEngine;
28
+ using UnityEngine.XR;
9
29
  using UnityEngine.XR.ARFoundation;
10
- using UnityEngine.XR.ARSubsystems;
11
30
 
12
-
31
+ [RequireComponent(typeof(ARTrackedImageManager))]
13
32
  public class AR : MonoBehaviour
14
33
  {
15
-
16
- /// マーカー用オブジェクトのプレハブ
17
- [SerializeField] private GameObject[] _arPrefabs;
34
+ [SerializeField]
18
- private GameObject Point;
35
+ private GameObject[] placeablePrefabs;
19
-
36
+
20
- /// ARTrackedImageManager
37
+ private Dictionary<string, GameObject> spawnedPrefabs = new Dictionary<string, GameObject>();
21
- [SerializeField] private ARTrackedImageManager _imageManager;
38
+ private ARTrackedImageManager trackedImageManager;
39
+
22
40
  Vector3 marker1Pos;
23
41
  Vector3 marker2Pos;
24
-
25
- /// マーカー用オブジェクトのプレハブと文字列を紐づけた辞書
42
+
26
- private readonly Dictionary<string, GameObject> _markerNameAndPrefabDictionary = new Dictionary<string, GameObject>();
27
43
 
28
- private void Start()
44
+ private void Awake()
29
45
  {
30
- _imageManager.trackedImagesChanged += OnTrackedImagesChanged;
46
+ trackedImageManager = FindObjectOfType<ARTrackedImageManager>();
31
47
 
32
- //辞書を作る 画像の名前とARオブジェクトのPrefabを紐づける
33
- for (var i = 0; i < _arPrefabs.Length; i++)
48
+ foreach (GameObject prefab in placeablePrefabs)
34
49
  {
50
+ GameObject newPrefab = Instantiate(prefab, Vector3.zero, Quaternion.identity);
35
- var arPrefab = Instantiate(_arPrefabs[i]);
51
+ newPrefab.name = prefab.name;
36
- _markerNameAndPrefabDictionary.Add(_imageManager.referenceLibrary[i].name, arPrefab);
37
- arPrefab.SetActive(false);
52
+ newPrefab.SetActive(false);
53
+ spawnedPrefabs.Add(prefab.name, newPrefab);
38
54
  }
39
55
  }
40
56
 
57
+ private void OnEnable()
58
+ {
59
+ trackedImageManager.trackedImagesChanged += ImageChanged;
60
+ }
61
+
41
62
  private void OnDisable()
42
63
  {
43
- _imageManager.trackedImagesChanged -= OnTrackedImagesChanged;
64
+ trackedImageManager.trackedImagesChanged -= ImageChanged;
44
65
  }
45
66
 
46
- private void ActivateARObject(ARTrackedImage trackedImage)
67
+ private void ImageChanged(ARTrackedImagesChangedEventArgs eventArgs)
47
68
  {
48
- //認識した画像マーカーの名前を使って辞書から任意のオブジェクトを引っ張り出す
49
- var arObject = _markerNameAndPrefabDictionary[trackedImage.referenceImage.name];
50
- var imageMarkerTransform = trackedImage.transform;
69
+ foreach (ARTrackedImage trackedImage in eventArgs.added)
70
+ {
71
+ UpdateImage(trackedImage);
72
+ }
73
+ foreach (ARTrackedImage trackedImage in eventArgs.updated)
74
+ {
75
+ UpdateImage(trackedImage);
76
+ }
77
+ foreach (ARTrackedImage trackedImage in eventArgs.removed)
78
+ {
79
+ spawnedPrefabs[trackedImage.name].SetActive(false);
80
+ }
81
+ }
51
82
 
52
-
83
+ private void UpdateImage(ARTrackedImage trackedImage)
84
+ {
85
+ string name = trackedImage.referenceImage.name;
86
+
53
- if (trackedImage.referenceImage.name == "MARKER1")
87
+ if (name == "MARKER1")
54
88
  {
55
89
  marker1Pos = trackedImage.transform.position;
56
90
  }
57
91
 
58
- else if (trackedImage.referenceImage.name == "MARKER2")
92
+ else if (name == "MARKER2")
59
93
  {
60
94
  marker2Pos = trackedImage.transform.position;
61
95
  }
62
-
63
- GameObject prefab = _markerNameAndPrefabDictionary[name];
64
96
 
65
- Vector3 center= Vector3.Lerp(marker1Pos,marker2Pos,0.5f);
97
+ Vector3 center = Vector3.Lerp(marker1Pos, marker2Pos, 0.5f);
66
98
 
99
+ trackedImage.transform.position = center;
100
+
101
+ //ここでKeyNotFoundException: The given key was not present in the dictionary.
102
+ //「指定されたキーが辞書に存在しませんでした」と表示される
103
+ GameObject prefab = spawnedPrefabs[name];
67
104
  prefab.transform.position = center;
68
-
69
- //位置合わせ
70
- var markerFrontRotation = imageMarkerTransform.rotation * Quaternion.Euler(90f, 0f, 0f);
71
- arObject.transform.SetPositionAndRotation(center, markerFrontRotation);
72
- arObject.transform.SetParent(imageMarkerTransform);
105
+ prefab.SetActive(true);
73
106
 
74
- //トラッキングの状態に応じてARオブジェクトの表示を切り替え
75
- arObject.SetActive(trackedImage.trackingState == TrackingState.Tracking);
76
- }
77
-
78
- private void OnTrackedImagesChanged(ARTrackedImagesChangedEventArgs eventArgs)
79
- {
80
- foreach (var trackedImage in eventArgs.added)
107
+ foreach (GameObject go in spawnedPrefabs.Values)
81
108
  {
109
+ if (go.name != name)
110
+ {
82
- ActivateARObject(trackedImage);
111
+ go.SetActive(false);
112
+ }
83
113
  }
84
-
85
- foreach (var trackedImage in eventArgs.updated)
86
- {
87
- ActivateARObject(trackedImage);
88
- }
89
114
  }
90
115
  }
91
116
  ```

1

内容を少し変えました。

2021/12/28 05:19

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,10 +1,9 @@
1
1
  ARFoudationを用いて、マーカー間の中心にオブジェクトを置きたいと考えています。
2
+ 二つのマーカーを用意してそれぞれのマーカーの上にオブジェクトを乗せることはできました。
2
- 二つのマーカーを用意しそれぞれのマーカーの上にオブジェクトをるこはできました。マーカー同士平均をとってその中心点をVector3にし,マーカーの位置をtransform.positionにして考えることはわかっているのですが、どのように書けばよいかからずお聞きしました。ご教示してると幸いです。
3
+ private void ActivateARObject(ARTrackedImage trackedImage)下でマーカー1と2決め中心点を求めオブジェクトを表示さようとしたのですが、処理が行れないという状況です。ご教示していたると幸いです。
3
4
 
4
5
 
5
-
6
6
  ```C#
7
-
8
7
  using System.Collections.Generic;
9
8
  using UnityEngine;
10
9
  using UnityEngine.XR.ARFoundation;
@@ -13,20 +12,17 @@
13
12
 
14
13
  public class AR : MonoBehaviour
15
14
  {
16
- /// <summary>
15
+
17
16
  /// マーカー用オブジェクトのプレハブ
18
- /// </summary>
19
17
  [SerializeField] private GameObject[] _arPrefabs;
20
- GameObject objA;
18
+ private GameObject Point;
21
- GameObject objB;
19
+
22
- /// <summary>
23
20
  /// ARTrackedImageManager
24
- /// </summary>
25
21
  [SerializeField] private ARTrackedImageManager _imageManager;
26
-
27
- /// <summary>
22
+ Vector3 marker1Pos;
23
+ Vector3 marker2Pos;
24
+
28
25
  /// マーカー用オブジェクトのプレハブと文字列を紐づけた辞書
29
- /// </summary>
30
26
  private readonly Dictionary<string, GameObject> _markerNameAndPrefabDictionary = new Dictionary<string, GameObject>();
31
27
 
32
28
  private void Start()
@@ -47,19 +43,32 @@
47
43
  _imageManager.trackedImagesChanged -= OnTrackedImagesChanged;
48
44
  }
49
45
 
50
-
51
46
  private void ActivateARObject(ARTrackedImage trackedImage)
52
-
53
47
  {
54
-
55
48
  //認識した画像マーカーの名前を使って辞書から任意のオブジェクトを引っ張り出す
56
49
  var arObject = _markerNameAndPrefabDictionary[trackedImage.referenceImage.name];
57
-
58
50
  var imageMarkerTransform = trackedImage.transform;
59
51
 
52
+
53
+ if (trackedImage.referenceImage.name == "MARKER1")
54
+ {
55
+ marker1Pos = trackedImage.transform.position;
56
+ }
57
+
58
+ else if (trackedImage.referenceImage.name == "MARKER2")
59
+ {
60
+ marker2Pos = trackedImage.transform.position;
61
+ }
62
+
63
+ GameObject prefab = _markerNameAndPrefabDictionary[name];
64
+
65
+ Vector3 center= Vector3.Lerp(marker1Pos,marker2Pos,0.5f);
66
+
67
+ prefab.transform.position = center;
68
+
60
- //位置合わせ
69
+ //位置合わせ
61
70
  var markerFrontRotation = imageMarkerTransform.rotation * Quaternion.Euler(90f, 0f, 0f);
62
- arObject.transform.SetPositionAndRotation(imageMarkerTransform.transform.position, markerFrontRotation);
71
+ arObject.transform.SetPositionAndRotation(center, markerFrontRotation);
63
72
  arObject.transform.SetParent(imageMarkerTransform);
64
73
 
65
74
  //トラッキングの状態に応じてARオブジェクトの表示を切り替え