2021年11月28日

AR Foundation 4.2のAR Anchorの使い方とその意義

AR Anchorなるものを使おうとして調べていたら、AR Foundation 4.2から、4.1.7までと仕様が変更されていることに気がついたのでメモ。
AR Anchor ManagerをAR Session Originにつけた状態で、アンカーをつけたいオブジェクトにAR AnchorをAdd Compontするだけ。4.1.7までは、AR Anchor Managerに専用の命令があったのが、一般的なUnityの命令に置き換わった感じでしょうか。
スクリプトを実際に見る前に、そもそもAR Anchorとはなんぞやという話になりますが、日本語のブログや解説を見ていてもちゃんと理解している人は少ないようです。一番参考になったのはこちら。
ARFoundation Anchors覚え書きmtwandのブログ
この記事を元に考えるに、通常のARではカメラを搭載したiPhoneなどのデバイスは、加速度センサーから割り出した自機の位置(6DoF)をもとに、補助的にカメラで得られた情報(visual odometry)を追加してオブジェクトを描画するのに対して、AR Anchorをつけたオブジェクトは光学的な特徴点を優先して周囲の映像との一致を向上させるのではないかと。つまり光学系による補正をより強化した状態になるのでしょう。このため、オブジェクトのUnity内での座標はリアルタイムに微調整され、スクリプトからはいじるなということのようです。
これを裏付ける記事はARKitでもAR Foundationでもなく、GoogleによるARCoreの解説にありました。
Working with anchors
As ARCore’s environmental understanding updates throughout an AR experience, virtual objects can appear to drift away from where they were placed. This can impact your app's realism and user experience.
Anchors ensure that objects appear to stay at the same position and orientation in space, helping you maintain the illusion of virtual objects placed in the real world.

つまり位置ズレを防ぐと述べてあります。
さて、実際のスクリプトですが、AR Raycast Hitでインスタンス化する場合の例をUnityの公式マニュアルで見てみましょう。
// ... here, we'll place the plane anchoring code!

// Otherwise, just create a regular anchor at the hit pose

// Note: the anchor can be anywhere in the scene hierarchy
var instantiatedObject = Instantiate(_prefabToPlace, hit.pose.position, hit.pose.rotation);

// Make sure the new GameObject has an ARAnchor component
anchor = instantiatedObject.GetComponent();
if (anchor == null)
{
anchor = instantiatedObject.AddComponent();
}

これでAR Anchorが置かれ、その物体はAR表示上でずれが生じにくくなります。
物体をスクリプトから移動する場合は、AR Anchorをいったん外す必要があります。
Destroy(GameObjectName.GetComponent());

これも、すでにAR Anchorが外れている、もしくはAR Anchorがないオブジェクトの可能性を考慮するなら、下記のほうがいいかもしれません。
anchor = instantiatedObject.GetComponent();
if (anchor != null)
{
Destroy(GameObjectName.GetComponent());
}

この他にAttachAnchor(ARPlane plane, Pose pose)という命令もあるのですが、これは平面推定で検出した平面上にオブジェクトを置く場合に役に立つそうです。
タグ:AR UNITY
posted by MacLab. at 09:09| Comment(0) | TrackBack(0) | 技術情報

2021年08月31日

MPEG Exporter TNG ver.3.9.1リリース

MET3 Icon
ffmpegとCoreMediaのGUIラッパーであるMPEG Exporter TNGのver.3.9.1 正式版です。
一度始めたファイル変換(エンコード)をスクリプトメニューから中止できるようにしました。これはネットワークインストーラから外部スクリプトをインストールするので、過去の全てのバージョンに適用されます。
このバージョンから、変換中でも設定画面を呼び出したり、次の変換の予約リストを修正したりすることができます。
ただし、変換中はパラメータの詳細設定画面を開くことはできません。
バージョン番号の振り方を変えました。

Download MPEG Exporter TNG ver. 3.9.1

ダウンロード後はダウンロードフォルダから他のフォルダに移動してから起動してください。
初回起動時に各OSの環境に合わせたライブラリをアプリ本体のパッケージ内にダウンロードします。
このバージョンの対応環境はEl Capitan以上です。Apple Siliconネイティブ対応です。
続きを読む
posted by MacLab. at 00:00| Comment(0) | TrackBack(0) | リリース情報

2021年07月18日

MPEG Exporter TNG ver.3.91 β2

MET3 Icon
ffmpegとCoreMediaのGUIラッパーであるMPEG Exporter TNGのver.3.91 β2版です。
(もういっそのことver.4のベータでいいのではないかという気もするくらい)
・変換、中断ボタンの動作をわかりやすく改良
・通知機能の動作の改良
・エラーメッセージが出なかった問題を解決
何が問題だったのかといえば、UIを操作できるのはメインスレッドだけというルールに抵触していたからです。
この場合のUIにはnotificationやbeepも含まれていたようです。バックグラウンドスレッドで通常のAppleScriptの用語のnotifyを呼んだ場合、同じスレッド内の他の処理が全て終わった時点で実行されるようです。
その解決方法として、Cocoa-AppleScriptを呼ぶことができます。具体的には次のようなスクリプトです。バックグラウンドスレッドからnotifyを呼ぶ方法についてweb上でなかなか(少なくとも日本語の)情報が見つからなかったので、紹介しておきます。なお、普通にメインスレッドでも動作します。Mojave以降はNSUserNotificationCenterそのものが非推奨となっていますが、Bigu Surでも動作します。

use framework "Foundation"
my performSelectorOnMainThread:"notification:" withObject:{aTitle:"通知です。", aSubtitle:"サンプルです。", aMessage:"長いテキストを入れています。"} waitUntilDone:true

on notification:theObj
set aTitle to aTitle of theObj
set aSubtitle to aSubtitle of theObj
set aMessage to aMessage of theObj
set userNotification to current application's NSUserNotification's alloc()'s init()
set userNotification's title to aTitle
set userNotification's subtitle to aSubtitle
set userNotification's informativeText to aMessage
current application's NSUserNotificationCenter's defaultUserNotificationCenter's deliverNotification:userNotification
current application's NSUserNotificationCenter's defaultUserNotificationCenter's setDelegate:me
userNotification's release()
end notification:
on userNotificationCenter:notificationcenter shouldPresentNotification:notification
return 1
end userNotificationCenter:shouldPresentNotification:

スクリプトエディタで開く

残った大きな問題は、すでに開始した変換処理を中断できないことです。バックグラウンドスレッドからメインスレッドにdo shell scriptでkillallを呼んでも、ffmpegを中断できないことです。他のアプリなどのプロセスからkillallすると中断できるので、原因はどこにあるのかわかりません。もしわかる方がいたら教えていただけると助かります。

Download MPEG Exporter TNG ver. 3.91 β2版
正式なver.3.91がリリースされても通知はでません。不具合がある場合は、安定版であるver.3.9をダウンロードし直してください。

ダウンロード後はダウンロードフォルダから他のフォルダに移動してから起動してください。
初回起動時に各OSの環境に合わせたライブラリをアプリ本体のパッケージ内にダウンロードします。
このバージョンの対応環境はEl Capitan以上です。Apple Siliconネイティブ対応です。
posted by MacLab. at 16:27| Comment(0) | TrackBack(1) | 技術情報