アンドロイドメモ
2011年10月11日火曜日
iPhone 4Sも?au新モデル購入予定者必見!エリア調査用端末レンタルのすすめ
2011年9月7日水曜日
2011年7月14日木曜日
SH-03C、IS11SHユーザー必見!?なるべく失敗しないように3D写真を撮るための技
一部を除き裸眼3D液晶搭載Androidとして定着してきたであろう、シャープの携帯たち。
裸眼3D搭載端末は3Dコンテンツやゲームを楽しめることはもちろん、3D写真の撮影ができるところも他のAndroidには無いお楽しみポイントだと言えよう!
そこで、私が編み出した3D写真撮影のコツを書き記しておきたいと思うんだ。
誠に恥ずかしながら、作例も載せております。
意外と難しい3D写真撮影
携帯電話で3D写真撮影を楽しむ。
一見楽しげな創造がふくらむ機能だ。
しかし、実際に使ってみると3D写真撮影は思いのほか上手くいかないことが多い。
イライラの挙句、結局使っていない人も多いのではないだろうか?
普通、3D写真が撮影できるカメラと言えば、レンズが二つ搭載されているものが多い。
が、しかしIS11SH、SH-03C、007SH(J)、003SH、005SHなど(以下:シングルレンズ機)にはレンズが一つしか無い。
そのためシングルレンズ機の場合は撮影時に端末の位置をずらして二枚の写真を連続で撮影し、その二枚の画像を合成し3D写真を生成するという、ある意味強引な撮影方法となっている。
そのせいか、なかなかどうして失敗も多いことだろう。
そんな人に私の考えた3D写真撮影方法を紹介したい。
LYNX 3Dだって、あと十年、いや一年は戦える!
目次
- 主に三種の「スタイル」があることに気付いた
- スウィンガー(Swinger)
- パームスクローラ(Palm Scroller)
- シフトスライディング(Shift Slidings)
- 3種のスタイル別「できあがり写真比較!」
- おまけ:シングルレンズ機における3D写真撮影の基本
主に三種の「スタイル」があることに気付いた
「スタイル」
・・そう、言うなれば「型」だ。
空手などでもあるよね?
あの「型」のようなものだと思ってくれればいい。
以下に説明する「スタイル」を徹底することで、3D写真撮影での失敗が劇的に減るはずだ。
私は下記の三つの「スタイル」を考案した。
以下に詳しい方法を説明しよう。
見本で撮影したデータも載せておくから、裸眼3D液晶端末ユーザーはダウンロードして見てちょうだいっ!
スウィンガー(Swinger)
この撮影方法はシングルレンズ機ユーザーにとっておそらく、最もポピュラーな撮影方法だろう。
ざっくり言うと、「自らの体を回転させ、2枚の画像を撮影する」方法だ。
ポピュラーなため、シングルレンズ機ユーザーの誰もがすでに使っているであろう撮影方法とも言える。
難易度:☆☆
成功度:☆☆
飛び出し度:☆☆☆
撮影方法
- 普通に構える(持ち方は自由)
- 3Dカメラを起動しシャッターを押す
- 丹田を中心に上半身を右に回転させる
スウィンガーについては特筆すべき点は無い。
なぜなら、おそらく誰もが自然に使っている方法だからだ。
強いてコツを挙げるなら、「上半身を固定すること」。
手や腕だけを使うような撮り方は失敗の原因となることが多い。
パームスクローラ(Palm Scroller)
この撮影方法は今回紹介する3種の「スタイル」のうち、最も失敗の少ない撮影方法と言えるだろう。
デート中など、とにかく時間の無いとき、また、失敗ばかりでお悩みだった人は、ぜひ試してみたらいいと思う。
私自信、イチ押しの撮影方法だ!
難易度:☆
成功度:☆☆☆☆☆
飛び出し度:☆☆
撮影方法
- レンズの直線上を左手人差し指と親指で持つ
- 3Dカメラを起動しシャッターを押す
- 左手人差し指と親指を支点にして本体を回転させる
「パームスクローラ」、あえて直訳するならば、「手のひらで回転」だ。
レンズの直線上を支点にさりげなく回転させる。
ちなみに、3D撮影をしていることを周囲に悟られにくいスタイルである。
ポーカーフェイスで3D撮影というのもシングルレンズ機の醍醐味かもしれない。
シフトスライディング(Shift Slidings)
この撮影方法は今回紹介する3種の「スタイル」のうち、最も躍動的な撮影方法だ。
3Dの飛び出しはズバ抜けている!
ただし、躍動的であるがゆえに失敗する可能性も高い撮影方法だ。
パンチの効いた一枚を撮りたい時に使ってみてほしい。
コンテストに応募するなら迷わずコレだ。
繰り返し、チャレンジしてほしい。
難易度:☆☆☆☆☆
成功度:☆
飛び出し度:☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
撮影方法
- 構える(要集中力)
- 3Dカメラを起動しシャッターを押す
- 本体の向きや角度を変えないようスライドさせるイメージで右へ動かす
簡単に言うと本体をそのまま右へスライドさせるイメージだ。
ポイントとしては、とにかく上下ブレしないこと。
そしてスライドさせる速度を一定に保つことだ。
失敗の多い撮影スタイルだが、成功するとなんか楽しいことうけあい!
3種のスタイル別「できあがり写真比較!」
それでは、誠にアレですが私の作例を見ていただこう。
(3D液晶じゃない人もなんとなく楽しめるようにイメージも載せてみました。)
ちなみに、裸眼3D液晶端末の人はTobidale3Dというアプリをインストールしておけばリンクをクリックで直接3D画像を見られるんだぜ・・!
一輪の花
- スウィンガー:Swinger
- パームスクローラ:Palm Scroller
- シフトスライディング:Shift Slidings
謎の柵
- スウィンガー:Swinger
- パームスクローラ:Palm Scroller
- シフトスライディング:Shift Slidings
佇むデジタル一眼
- スウィンガー:Swinger
- パームスクローラ:Palm Scroller
- シフトスライディング:Shift Slidings
風車小屋に近づく
- スウィンガー:Swinger
- パームスクローラ:Palm Scroller
- シフトスライディング:Shift Slidings
風車小屋から離れる
- スウィンガー:Swinger
- パームスクローラ:Palm Scroller
- シフトスライディング:Shift Slidings
彼女の名は「まんじゅう」
- スウィンガー:Swinger
- パームスクローラ:Palm Scroller
- シフトスライディング:Shift Slidings
おまけ:シングルレンズ機における3D写真撮影の基本
念のため基本もおさらいしていただこう。
ポイントは5つ!
下記の基本を守るだけでも失敗は減ると思う。
・とにかくしっかり掴む(ホールド)する
・一枚目→二枚目の撮影はゆっくりと行う
・体ごと動かない
・ピント合わせとシャッターはタッチパネルで行う
・一枚目と二枚目で上下をズレさせないこと
上記のポイントを外さなければ失敗は減ることうけあい、に違いない!
特にシャッターボタンは手ブレの原因にもなったりする。悲しいことだ。
いつもの一言
さて、どうだろう。
失敗写真は減ったかな?
ちなみに、上記を試してもなお失敗してしまうようなら、さっぱり諦めるのも一つのやり方だと思うよっ!
参考になるかどうかわからないけど、良い画を撮ってくれよっ!
そして言っておきたいことがある。
それは「愛」だよ・・。
我々はこの端末に出会ってしまい、購入した。
人によっては二年契約という人もいるだろう。
だがこれもひとつの「縁」だ。
携帯電話など所詮道具に過ぎん・・。
水に濡れればたちどころに逝ってしまう。
そんな携帯電話の短い一生である二年間をともに笑い、泣き、付き合ってやるのが我々が携帯電話にしてやれるせめてもの餞というものだ。
そう思わないかい?
ちなみに次回、3D写真について更なる楽しみを追求する予定です。
2011年7月9日土曜日
複数のマーカーをクリックした時に同じ表示になってしまう時の対処法
対応方法が下記のページに出ていたので組み込んでみた
http://www.nanchatte.com/map/showDifferentInfoWindowOnEachMarker.html
しかし、alertではうまく動作しなかったので吹き出しのまま使用した
<!DOCTYPE html>
<html><head>
<meta charset="utf-8">
<script type="text/javascript" src="jsWaffle.js"></script>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=true&language=ja"></script>
<script type="text/javascript">
window.onload = function () {
// マップ(map_canvas)を画面全体に表示する
var disp = droid.getDisplayInfo();
$("map_canvas").style.width = disp["width"] + "px";
$("map_canvas").style.height = disp["height"] + "px";
// Googleマップを初期化する
var latlng = new google.maps.LatLng(36.323433,139.356441);
var mypos = new google.maps.LatLng(36.323433,139.356441);
// 自分の位置
var mapOptions = {
// ズームは大きくなるほど拡大される
zoom:15,
center:latlng,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var gmap = new google.maps.Map($("map_canvas"), mapOptions);
// 目的地にマーカー
var poslist=[
[36.323433,139.356441,"目的地2"],
[36.328433,139.356441,"目的地1"]
];
function attachMessage(marker, msg) {
google.maps.event.addListener(marker, 'click', function(event) {
new google.maps.InfoWindow({
content: msg
}).open(marker.getMap(), marker);
});
}
for(var i=0;i<poslist.length;i++){
var lat=poslist[i][0];
var lng=poslist[i][1];
var txt=poslist[i][2];
var latlng = new google.maps.LatLng(lat, lng);
var marker=new google.maps.Marker({
position: latlng,
map:gmap
});
attachMessage(marker,txt);
}
// 自分にマーカー
var mymarker=new google.maps.Marker({
position: mypos,
map: gmap,
icon: "man.png"
});
// 情報ウィンドウの設定
var infowindow=new google.maps.InfoWindow({
content: "最初の目的地",
maxWindow:300
});
// マーカーをクリックした時のイベント
// 位置情報を定期的にチェックする
var posOptions = {
enableHighAccuracy: true,
timeout: 1000 * 10,
maximumAge: 1000 * 3
};
droid.watchPosition(positionHandler, errorHandler, posOptions);
function positionHandler(position) {
// 緯度
var lat = position.coords.latitude;
// 経度
var lon = position.coords.longitude;
// 精度
var acc = position.coords.accuracy;
// 現在位置まで線を引く
var latlng = new google.maps.LatLng(lat, lon);
var mypos = new google.maps.LatLng(lat,lon);
gmap.panTo(latlng);
mymarker.setPosition(latlng);
// 距離の計算
var dis=Math.floor(Math.sqrt((Math.pow((36.323433-lat)*100*1110,2)+Math.pow((139.356441-lon)*100*910,2))));
// 情報ウィンドウの設定
var myinfo=new google.maps.InfoWindow({
content: "目的地までの距離" + dis + "m。" + "確認したら閉じてください",
maxWindow:300
});
// マーカーをクリックした時のイベント
google.maps.event.addListener(mymarker,'click',function(event){
myinfo.open(gmap,mymarker);
});
}
function errorHandler(errorObj) {
droid.log(errorObj.message);
}
};
</script>
<style>
* { margin:0; padding:0; }
</style>
</head><body>
<div id="map_canvas"></div>
</body></html>
マーカーのJSON配列の例
- window.onload = function() {
- if (GBrowserIsCompatible()) {
- var map = new GMap(document.getElementById("map"));
- //地図の中心
- var point =new GPoint(-122.1419, 37.4419);
- map.centerAndZoom(point, 13);
- var marks = [
- { id:1, lat:41, lng:-121, text:'sample1' },
- { id:2, lat:42, lng:-122, text:'sample2' },
- { id:3, lat:43, lng:-123, text:'sample3' },
- { id:4, lat:43, lng:-134, text:'sample4' },
- { id:5, lat:40, lng:-135, text:'sample5' }
- ];
- function addMarker( mark ) {
- var latlng = new GLatLng( mark.lat, mark.lng );
- var marker = new GMarker( latlng );
- map.addOverlay( marker );
- GEvent.addListener( marker, 'click', function() {
- marker.openInfoWindowHtml( mark.id + ': ' + mark.text );
- });
- };
- for( var i = 0; i <marks.length; ++i ){
- addMarker( marks[i] );
- };
- }
各目的地にアラートがでるように設定
<!DOCTYPE html>
<html><head>
<meta charset="utf-8">
<script type="text/javascript" src="jsWaffle.js"></script>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=true&language=ja"></script>
<script type="text/javascript">
window.onload = function () {
// マップ(map_canvas)を画面全体に表示する
var disp = droid.getDisplayInfo();
$("map_canvas").style.width = disp["width"] + "px";
$("map_canvas").style.height = disp["height"] + "px";
// Googleマップを初期化する
var latlng = new google.maps.LatLng(36.323433,139.356441);
var mypos = new google.maps.LatLng(36.323433,139.356441);
// 自分の位置
var mapOptions = {
// ズームは大きくなるほど拡大される
zoom:15,
center:latlng,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var gmap = new google.maps.Map($("map_canvas"), mapOptions);
// 目的地にマーカー
var poslist=[[36.323433,139.356441],[36.328433,139.356441]];
for(var i=0;i<poslist.length;i++){
var lat=poslist[i][0];
var lng=poslist[i][1];
var latlng = new google.maps.LatLng(lat, lng);
var marker=new google.maps.Marker({
position: latlng,
map:gmap
});
google.maps.event.addListener(marker,'click',function(event){
alert("目的地");
});
}
// 自分にマーカー
var mymarker=new google.maps.Marker({
position: mypos,
map: gmap,
icon: "man.png"
});
// 情報ウィンドウの設定
var infowindow=new google.maps.InfoWindow({
content: "最初の目的地",
maxWindow:300
});
// マーカーをクリックした時のイベント
// 位置情報を定期的にチェックする
var posOptions = {
enableHighAccuracy: true,
timeout: 1000 * 10,
maximumAge: 1000 * 3
};
droid.watchPosition(positionHandler, errorHandler, posOptions);
function positionHandler(position) {
// 緯度
var lat = position.coords.latitude;
// 経度
var lon = position.coords.longitude;
// 精度
var acc = position.coords.accuracy;
// 現在位置まで線を引く
var latlng = new google.maps.LatLng(lat, lon);
var mypos = new google.maps.LatLng(lat,lon);
gmap.panTo(latlng);
mymarker.setPosition(latlng);
// 距離の計算
var dis=Math.floor(Math.sqrt((Math.pow((36.323433-lat)*100*1110,2)+Math.pow((139.356441-lon)*100*910,2))));
// 情報ウィンドウの設定
var myinfo=new google.maps.InfoWindow({
content: "目的地までの距離" + dis + "m。" + "確認したら閉じてください",
maxWindow:300
});
// マーカーをクリックした時のイベント
google.maps.event.addListener(mymarker,'click',function(event){
myinfo.open(gmap,mymarker);
});
}
function errorHandler(errorObj) {
droid.log(errorObj.message);
}
};
</script>
<style>
* { margin:0; padding:0; }
</style>
</head><body>
<div id="map_canvas"></div>
</body></html>
複数のマーカーを表示
<html><head>
<meta charset="utf-8">
<script type="text/javascript" src="jsWaffle.js"></script>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=true&language=ja"></script>
<script type="text/javascript">
window.onload = function () {
// マップ(map_canvas)を画面全体に表示する
var disp = droid.getDisplayInfo();
$("map_canvas").style.width = disp["width"] + "px";
$("map_canvas").style.height = disp["height"] + "px";
// Googleマップを初期化する
var latlng = new google.maps.LatLng(36.323433,139.356441);
var mypos = new google.maps.LatLng(36.323433,139.356441);
// 自分の位置
var mapOptions = {
// ズームは大きくなるほど拡大される
zoom:15,
center:latlng,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var gmap = new google.maps.Map($("map_canvas"), mapOptions);
// 目的地にマーカー
var poslist=[[36.323433,139.356441],[36.328433,139.356441]];
for(var i=0;i<poslist.length;i++){
var lat=poslist[i][0];
var lng=poslist[i][1];
var latlng = new google.maps.LatLng(lat, lng);
var marker=new google.maps.Marker({
position: latlng,
map:gmap
});
}
// 自分にマーカー
var mymarker=new google.maps.Marker({
position: mypos,
map: gmap,
icon: "man.png"
});
// 情報ウィンドウの設定
var infowindow=new google.maps.InfoWindow({
content: "最初の目的地",
maxWindow:300
});
// マーカーをクリックした時のイベント
google.maps.event.addListener(marker,'click',function(event){
infowindow.open(gmap,marker);
});
// 位置情報を定期的にチェックする
var posOptions = {
enableHighAccuracy: true,
timeout: 1000 * 10,
maximumAge: 1000 * 3
};
droid.watchPosition(positionHandler, errorHandler, posOptions);
function positionHandler(position) {
// 緯度
var lat = position.coords.latitude;
// 経度
var lon = position.coords.longitude;
// 精度
var acc = position.coords.accuracy;
// 現在位置まで線を引く
var latlng = new google.maps.LatLng(lat, lon);
var mypos = new google.maps.LatLng(lat,lon);
gmap.panTo(latlng);
mymarker.setPosition(latlng);
// 距離の計算
var dis=Math.floor(Math.sqrt((Math.pow((36.323433-lat)*100*1110,2)+Math.pow((139.356441-lon)*100*910,2))));
// 情報ウィンドウの設定
var myinfo=new google.maps.InfoWindow({
content: "目的地までの距離" + dis + "m。" + "確認したら閉じてください",
maxWindow:300
});
// マーカーをクリックした時のイベント
google.maps.event.addListener(mymarker,'click',function(event){
myinfo.open(gmap,mymarker);
});
}
function errorHandler(errorObj) {
droid.log(errorObj.message);
}
};
</script>
<style>
* { margin:0; padding:0; }
</style>
</head><body>
<div id="map_canvas"></div>
</body></html>