約 1,911,391 件
https://w.atwiki.jp/n-dolphin/pages/14.html
https://w.atwiki.jp/gods/pages/118080.html
キャサリンティッピング(キャサリン・ティッピング) グレートブリテン貴族のアーチャー男爵の系譜に登場する人物。 関連: サートマスティッピング (サー・トマス・ティッピング、父) トマスアーチャー (トマス・アーチャー、夫) キャサリンアーチャー (キャサリン・アーチャー、娘) アン(23) (娘) アンドルーアーチャー (アンドルー・アーチャー、息子)
https://w.atwiki.jp/deadly/pages/51.html
イベント概要 イベントの開催は不定期で告知をもって行われる。 一般的なタイピングに先着順を付けて競うゲーム。 参加者にはイベントの最後に賞品を受け取る事が出来る。 参加条件 参加条件は特に無し。 必要Lv 無し 必要装備 無し 職業制限 無し PT制限 無し イベント会場スクリーンショット イベントが行われた時に適当に撮影し、アップロードを行います。
https://w.atwiki.jp/cloud9science/pages/110.html
2008-12-28 動画をご覧ください。落下させたストローがすごい勢いで地面から発射されます。 上の動画はご近所さんに出演していただきました。 ジャンピング・ストロー 材料とつくり方 遊び方と注意 ジャンピング・ストロー 関高校のI井先生から教えていただきました。同僚の先生のご紹介だそうです。スーパーボールを3段重ねにした『すっ飛びボール』というおもちゃがありましたが、これは同じ原理を利用しています。そしてずっと簡単につくることができます。 材料とつくり方 スーパーボール、竹串(15cm)、ストロー、ビニールテープ、はさみ、千枚通し 材料はすべて100円ショップで調達しました。スーパーボールに千枚通しで下穴を開け、竹串を刺します。貫通させないように。ストローを8cm程度に切り、片方の端にビニールテープを二重に巻きます。危険防止のため、ビニールテープはストローから1mmくらいはみ出るようにしてください。これで完成! 100円ショップのスーパーボールに竹串を刺すと、どうしてもひび割れてしまいます。100円ショップには、マーブル模様のものと、擦りガラス風のものとがありましたが、マーブル模様のもののほうが、比較的割れにくいようです。東急ハンズで購入した1個70円のスーパーボールは比較的ひび割れにくいようです。しかし、ストローの飛び方にはあまり違いはないようです。 遊び方と注意 ストローのビニールテープを巻いた側が上に向くようにして、ストローを竹串に通します。スーパーボールを下にして、竹串の先端をもち、ぶら下げます(下の写真参照)。そのまま腕をいっぱいに水平に伸ばした状態で手を離し、落下させます。すると地面に当たった瞬間に、ストローがすごい勢いで空に向かって発射されます。固くて平らな水平面に落下させてください。 ストローがかなりのスピードで飛びます。眼に当たると怪我をすることもありえます。遊ぶときは必ず、いっぱいに腕を伸ばして落下させること(自分に当たらないように)、ストローの向きを間違えないように(当たってもビニールテープがクッションになるので)、自分の周りの状況に注意すること(他の人に当てないように)を必ず守ってください。 名前 コメント Copyleft2005-2008, yu-kubo.cloud9 all rights reversed
https://w.atwiki.jp/yougosq/pages/3325.html
■トラッピング 各作品のデータ 新2 効果:自分と左右の味方に罠をはり、物理攻撃してきた敵に近接斬攻撃でカウンターを行う説明:罠をはって敵の攻撃を待ち構えるスキル 詳細:アクティブ・攻撃:剣専用・鞭専用(Lv10) / 消費TP8~TP16 / 腕、STR / 前提:物理攻撃ブーストLv10(必要SP10)習得:ダクハン 世界樹の迷宮l・llに登場するダークハンターのスキル。自分と左右の味方に攻撃してきた相手にカウンター攻撃を行う。 無印では剣専用スキルで、物理と属性両方に反応できた。Ⅱでは前提が重くなったが剣と鞭両方で使えるようになり、物理専用カウンターになった。 複数回攻撃にはきっちり回数分お返しする。が、Ⅱではレベルが低いと反撃発動率が低い。使うならしっかりレベルを上げておくこと。 これを使った時に限って後列に攻撃が飛ぶことも稀に良くある。ダクハンの技は人数縛りすることで価値が上がるものが多い トラッピング 攻撃を回避しては発動しないのが悩みのタネ。パラディンのダーメージ軽減+回避率ゼロの物理ガードスキルが好相性。 トラッピング以外の技を全部切り捨てて、余ったスキルポイントはマスタリやブースト に回してもお釣りがくるくらいの価値はあり。 ジエンドやオールボンテージにエクスタシーなどが目立つが、これも十分すぎるほど強力。パラディンと組ませるだけで、あのヘカトンですら完封できる。 新世界樹にもトラッピングがありますよーに・・・1で鞭→剣にしたらトラッピングが無ければ生きていけないトラッピング脳になってしまった…いや別になかったらしょうがないって思うだけだけど。 2では隣の味方に来た攻撃を返す場合でも威力が減らない。 新世界樹でも健在。ついでに鞭剣両方でできる ダークハンターと言えばオルボンのイメージだが、クリア後だとこちらの方が強力。 全体攻撃や複数回攻撃が当たり前となるのでとんでもないダメージを叩き出す。 使ったターンに限って後列にばかり攻撃が飛んで来ても泣かないこと。…何故かよくあるんすよorz 新ではパリングや光掌の術式等で攻撃を無効化すると発動しない。エキスパートの猛攻撃を抑える工夫が必要不可欠だけど、工夫する価値は大いにある。 エキスパの火力の中では少々使いづらい。パラディンのパワディバと相性がそこそこいい。パラディンの渾身やオートガードがあればなお良し ディノゲーター相手に斬撃耐性高めて真正面から殴り合う時もこれ。甘噛みは攻撃回数が多いので反撃が入りまくる。 相性の悪いボスに当たった時が辛い。中盤まではかなり強いが後半になるとそういう奴が増えてくるので振り直し前提と考えてもいいかも。 むしろ後半戦から本領発揮するイメージだな。ダクハンにとって連発しづらい消費TPの重さや敵の攻撃回数が補強されてくるにかけて安定性が増す。 確かに相性悪い敵も多いけど、だからこそこの尖った個性が好きだ。 新2ではⅡの復活や消費TP減少に加え無効化でも発動するようになって使いやすくなったね 当然だが巫剣マスタリーがあれば杖でも使える。少しシュールなことになるが…… 新2だと味方に殴られて発動、ってことがなくなったっぽい? 初代から状態異常を決めて一方的に攻撃するのが得意なクラスでありながら状態異常が全く効かない敵が相手でも活躍出来るってコンセプトは地味によく出来てると思った 新2では スケープゴートで押し付けると 回数稼げる。 上から2番目で両方に反応って書いてあるからちょっと試してみたけど、岩男のサンダーウィングやセルのエクスプロウドには反応しなかったから、初代でも物理攻撃にしか反応しないはず。多分三色属性の場合は物理を含む複合属性でないといけないと思うが。 誘い受けからの一転攻勢というサディズム感の見え隠れするスキル このスキルとは関係ないが、海外では男の娘を「トラップ」と呼ぶこともあるそうだ 新2:Lv1 → スキル習得 最大攻撃回数2 消費TP8 / Lv2~Lv4 → 攻撃力↑ 最大攻撃回数2 / Lv5 → 攻撃力↑↑ 最大攻撃回数2 連続発動率↑ 消費TP10Lv6~Lv9 → 攻撃力↑ 最大攻撃回数2 / Lv10(★) → 攻撃力↑↑ 最大攻撃回数3 連続発動率↑ 消費TP16 新2では、物理(斬・突・壊)属性に反応する。 新2のこれ弱すぎでは…。なんで敵HPがシリーズ屈しの低さの旧2よりインフレが進んだ新2のほうがスキル倍率下がってるんだ…?おまけに初代仕様だしⅠⅡ両方極めるのに必要なSPも増えてるし…。この程度の性能なら斬限定じゃなくて武器属性依存くらい付けてもよかったのでは。 ↑新2は初代仕様じゃなくて庇う系スキルでも、回避や無効化でも反応することもあって威力面ばかりが弱体化ってわけでもない。ソードマンがグリモアで使うとフォースブーストに反応するし、当のグリモアコンボを警戒した感もある。じゃあ強いか?って言われると新2でちゃんと使ったこと無いからなんとも言えないけど、カウンタースキルの「刺さる相手にはぶっ刺さる」とグリモアというシステム考えると新2のトラッピングは妥当だと思うよ 全く別時代の、世紀末バランスの旧2と比べても仕方ないが…新2のこの手のスキルはしっかり回数稼いで使うような調整だからね。例えば単純計算で、敵の全体攻撃を1列分返すだけでLv★★の倍率680%。新2の平均的な攻撃スキルよりずっと高いし、みがわりやスケープゴート合わせられればもうちょっと跳ねる。ただ新2はエクスタソウリベ狙いが主流なのであまり使われん 初代リマスターで初めて使ったけどめっちゃ楽しいねコレ。裏ボスでツバメ返し余裕で超える火力叩き出して燃えたわ 剣ダクお前こんなに強かったのか ↑↑例えば同じ剣スキルのハリケーンが連続使用できないとはいえ690%だし、同じダクハンの剣スキルのソウルリベレイトが1365%でトラッピング最大ダメージのときの1160%上回るしで別にずっと高いわけではなくない? ↑↑↑コメした者だけど、新2のスキル倍率はデメリットや条件の無いスキル★★が大体450%前後だから、「平均的なスキル」としてその辺の数値をイメージしてる感じ。ここより高い倍率は何かしらの条件がつくから、後は条件と倍率のバランスの問題になる。で、比較的達成が簡単そうな「全体攻撃を一列分返す」という条件だけで680%も出るわけだし、まあとりたてて弱いという事は無いかなという印象 赤竜がこれにバンバン引っかかってくれて楽に倒せた ↑↑しれっとずっと高いから弱いということは無いまで評価落ちてて笑う。それにしても旧2のこれ本当に強いね。一回で竜のHPが1~2割削れたぞ。 いや「新2の条件無しスキルよりはずっと高い=条件有りスキルとしての高倍率はしっかりあり、決して弱いスキルとは言えない」という話であって、「条件有りスキルの中で強い方なのかは、また別の話」って事だが。実際条件有りのスキルの中で最強クラスなエクスタソウリベと比較されてしまう問題はいかんとも言い難いしな(でもそれはトラッピング側の問題では無い) 実際旧2で使った後に新2で使うと爽快感だいぶ減ってるのは確かだよね。旧2じゃオルボンでお手軽なエクスタシーよりも威力高かったのに新2じゃスティグマでもっと簡単になったエクスタシーに大きく水開けられちゃってるし。 旧作のこれマジで強いなセルのランダムターンに使ってるだけで4~6000は削れてあっという間だった。Ⅱ無くて属性ターンに無力だから微妙かと思ってたけど必要無かったわ・・・ コメント
https://w.atwiki.jp/okura/pages/18.html
チャーラ チャララー 毛利「日輪ショッピングの時間だ」 兄貴「今日もとびっきりの商品を紹介するぜ!」 毛利「いやーのほーるをかっぽじって聞くがいい」 兄貴「出だしからパクリ!?」 毛利「今日の商品はこれだ」 ジャジャーン 兄貴「何だこれは?フラフープか?」 毛利「だが只のフラフープではない。見るがいい」 兄貴「こっこれは!!最先端の技術を駆使して計算された 形状と重量が見事に腰にフィットし、ダイエット効果が 非常に高くこれを毎日使えば適度な運動が新陳代謝を 活性化させお肌もツヤツヤになるという効果もあり そしてなおかつ」 毛利「五月蝿い。実際に使った者の声だ」 ナレーション(若本)「甲斐地方にお住まいのYさんの声」 Yさん「某、これで鍛えてお館さまのお役に立ってみせるでござる! うぉ館さまああああああ!!!」 ナレーション(若本)「東北地方にお住まいのIさんの声」 Iさん「これを使って腰を振ってると、村のみんなが鼻血出しながら 喜んでくれるだ!!」 毛利「我が毛利家の家紋付き日輪フラフープ、 今なら同じものがもう1本付いてくる」 兄貴「申し込みはご覧の電話番号またはeメールまで、今すぐ!」 Q 気になるお値段はいくらなんですか? A なんと19800ニチリン しかし実は不良品、初期購入客を実験台代わりにするオクラ 「客など所詮捨て駒よ」と発言したのがばれて光合成禁止されるオクラ その腹いせにバケツ一杯のサンオイルを兄貴にぶっかけるオクラ 瀬 戸 内 海 戦 争 勃 発
https://w.atwiki.jp/mppc/pages/19.html
MAP作ってみました。 (記載には誤字、マッピングミス等誤りがある場合があります。ご了承下さい。) imageプラグインエラー ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (ミール地方.jpg) imageプラグインエラー ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (サウル鉱山.jpg) imageプラグインエラー ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (ラズラの森・遺跡.jpg) imageプラグインエラー ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (ラピサルハイム地方.jpg) imageプラグインエラー ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (双角の塔.jpg) imageプラグインエラー ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (ジェドの森・尾根.jpg) imageプラグインエラー ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (カーネリア・サイアン付近.jpg) imageプラグインエラー ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (パライバ付近.jpg) 秘密の鉱脈+α ver1.00 by生産者 画像 でかいため注意です。
https://w.atwiki.jp/tsuvoc/pages/1860.html
月刊ピングー増刊号 げっかんぴんぐーぞうかんごう (実・OhD・UPS, 93-96)相模原市の女性リスナー。Ohデカ最終回直前の回に、今までノベルティとして送った変なグッズを持ってきた人はニッポン放送に入れてあげると呼び込んだところ、浅漬のもとを持ってきた。96年元日の深夜の馬鹿力「クイズ王スペシャル」にも出演。本名高坂こずえ。
https://w.atwiki.jp/wiki3_sister/pages/546.html
『ラブリーラッピング』 ジャンル シミュレーション ダウンロード先 http //f4.aaa.livedoor.jp/~jiscald/free12.htm あらすじ&解説 ファンシーショップの店員になって品物をラッピングしよう。 客の気に入ったラッピングをすると店の好感度がUP。 気に入らないラッピングをしたり、袋を切らしてラッピングできなかったりすると 好感度がDOWNしてしまう。 好感度が下がりすぎると天長からクビを言い渡されてしまうから注意。 セーブできないのでクリアできるかは運しだい。 仕入れパートで売り出される様々なシールを集めるのもこのゲームの楽しみ方の一つ。 ゲームオーバーになってしまっても、一度手に入れたシールは後で閲覧することが出来る。 主な登場人物 ○天長 ○ロクサン ○死美 ○花豆 ○はりね? ○ヒコ゜ピコ゜ヒコ゜クン ○ぷん子 ○としくん? ○セブン ○ムン ○ツン ○わたっ娘 ○ユカリー? ○モナト ○天伊ゆうか ○どこかの国の王様 ○のぶひと? ○バイオン ○運坊 ○徳次郎? ○リチャード? ○ターミン ○雲歩狼 ○さなちゃん? ○ぶぶこ? ○某国の王子
https://w.atwiki.jp/opengl/pages/315.html
バンプマッピングです。 右はバンプマップ無しで左がバンプマップ有りの状態です。 バンプマッピングは見る角度によっては思ったような効果は出ません。 brick128.png bump128.png vertex.shader //フラグメントシェーダーに渡す変数 varying vec3 P;//位置ベクトル varying vec3 N;//法線ベクトル varying vec3 T;//接線ベクトル varying vec3 B;//従法線ベクトル attribute vec3 tangent;//OpenGLから void main(void) { P = vec3(gl_ModelViewMatrix * gl_Vertex); N = normalize(gl_NormalMatrix * gl_Normal); T = normalize(gl_NormalMatrix * tangent); B = cross(N, T);//従法線ベクトル gl_TexCoord[0] = gl_MultiTexCoord0; gl_Position = ftransform() ; } flagment.shader //頂点シェーダーから受け取る変数 varying vec3 P;//位置ベクトル varying vec3 N;//法線ベクトル varying vec3 T;//接線ベクトル varying vec3 B;//従法線ベクトル uniform sampler2D colorMap;//カラーマップ uniform sampler2D normalMap;//法線マップ void main(void) { //高度勾配 vec3 grad = (texture2D(normalMap, gl_TexCoord[0].st).xyz - 0.5) * 2.0; N = normalize( N - grad.x * T - grad.y * B); //以下は通常のライティング vec3 L = normalize(gl_LightSource[0].position.xyz - P); vec4 ambient = gl_FrontLightProduct[0].ambient; float dotNL = dot(N, L); vec4 diffuse = gl_FrontLightProduct[0].diffuse * max(0.0, dotNL); vec3 V = normalize(-P); vec3 H = normalize(L + V); float powNH = pow(max(dot(N, H), 0.0), gl_FrontMaterial.shininess); if(dotNL = 0.0) powNH = 0.0; vec4 specular = gl_FrontLightProduct[0].specular * powNH; //テクスチャの色 vec4 texColor = texture2D(colorMap, gl_TexCoord[0].st); gl_FragColor = (ambient + diffuse) * texColor + specular; } main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #pragma comment(lib, glew32.lib ) #include windows.h #include GL/glew.h #include GLSL.h #include math.h #include GL/freeglut/freeglut.h #include PNG.h #define PAI 3.14159 GLSL glsl; //affine変換用変数 float pos[][3] = { //位置(平行移動) { 0.75, 1.0, 0.0},//obj0 {-0.75, 1.0, 0.0} //obj1 }; float pos0[][3] = {//初期値 { 0.75, 1.0, 0.0},//obj0 {-0.75, 1.0, 0.0} //obj1 }; float scale[][3] = {//サイズ(スケーリング) { 1.0, 1.0, 1.0 },//obj0 { 1.0, 1.0, 1.0 } //obj1 }; float scale0[][3] = {//初期値 { 1.0, 1.0, 1.0 }, //obj0 { 1.0, 1.0, 1.0 } //obj1 }; float angle[][3] = {//姿勢(回転) { 0.0, 0.0, 0.0}, //obj0 { 0.0, 0.0, 0.0} //obj1 }; float angle0[][3] = {//初期値 { 0.0, 0.0, 0.0}, //obj0 { 0.0, 0.0, 0.0} //obj1 }; //光源 float lightPos[] = {10.0, 15.0, 10.0, 1.0};//光源位置 float lightPos0[] = {10.0, 15.0, 10.0, 1.0};//光源位置(初期値) //影のマテリアル float shadowDiffuse[] = {0.0,0.0,0.0,0.3};//影の拡散光 float shadowSpecular[] = {0.0,0.0,0.0,1.0};//影の鏡面光 //カメラと視体積 struct View { //カメラ float pos[3];//位置(視点) float cnt[3];//注視点 float dist; //注視点から視点までの距離 float theta; //仰角(水平面との偏角) float phi; //方位角 //視体積 float fovY; //視野角 float nearZ; //前方クリップ面(近平面) float farZ; //後方クリップ面(遠平面) }; View view = { 0.0, 0.0, 0.0,//pos(仮設定) 0.0, 1.0, 0.0,//cnt 10.0, 30.0, 20.0,//dist, theta, phi 30.0, 1.0, 100.0//fovY,nearZ, farZ }; View view0 = view; //Windowのサイズ int width = 640; int height = 480; //アフィン変換 enum SELECT_KEY {ROTATE, SCALE, TRANSLATE, LIGHT}; SELECT_KEY sKey = TRANSLATE; //マウス操作 int xStart, yStart; bool flagMouse = false; //影のフラグ bool flagShadow = false; //回転アニメーション float ang = 0.0; float dang = 0.1;//角度増分 //texture #define TEX_WIDTH 128 #define TEX_HEIGHT 128 GLubyte texImage[TEX_HEIGHT][TEX_WIDTH][4]; GLubyte normalMap[TEX_HEIGHT][TEX_WIDTH][3]; GLuint texName[6]; TEXTURE *texture[6]; float inv = 1.0;//凹凸反転 float fGrad = 5.0;//勾配強調 void drawCube(float s){ float p[8][3] = { {0.5*s,0.5*s,0.5*s}, {-0.5*s,0.5*s,0.5*s}, {-0.5*s,-0.5*s,0.5*s}, {0.5*s,-0.5*s,0.5*s},{0.5*s,0.5*s,-0.5*s}, {-0.5*s,0.5*s,-0.5*s}, {-0.5*s,-0.5*s,0-0.5*s}, {0.5*s,-0.5*s,-0.5*s} }; glBegin(GL_QUADS); glNormal3f(0.0f,0.0f,1.0f); //z方向 glVertex3fv(p[0]); glVertex3fv(p[1]); glVertex3fv(p[2]); glVertex3fv(p[3]); glNormal3f(1.0f,0.0f,0.0f); //x方向(正面) glVertex3fv(p[0]); glVertex3fv(p[3]); glVertex3fv(p[7]); glVertex3fv(p[4]); glNormal3f(0.0f,1.0f,0.0f); //y方向 glVertex3fv(p[0]); glVertex3fv(p[4]); glVertex3fv(p[5]); glVertex3fv(p[1]); glNormal3f(-1.0f,0.0f,0.0f); //-x方向 glVertex3fv(p[1]); glVertex3fv(p[5]); glVertex3fv(p[6]); glVertex3fv(p[2]); glNormal3f(0.0f,-1.0f,0.0f); //-y方向 glVertex3fv(p[2]); glVertex3fv(p[6]); glVertex3fv(p[7]); glVertex3fv(p[3]); glNormal3f(0.0f,0.0f,-1.0f); //-z方向 glVertex3fv(p[4]); glVertex3fv(p[7]); glVertex3fv(p[6]); glVertex3fv(p[5]); glEnd(); } void setLight(){ float lightAmbient0[] = {0.5, 0.5, 0.5, 1.0}; //環境光 float lightDiffuse0[] = {1.0, 1.0, 1.0, 1.0}; //拡散光 float lightSpecular0[] = {1.0, 1.0, 1.0, 1.0};//鏡面光 glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmbient0); glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDiffuse0); glLightfv(GL_LIGHT0, GL_SPECULAR, lightSpecular0); glLightfv(GL_LIGHT0, GL_POSITION, lightPos); glEnable(GL_LIGHT0); glEnable(GL_LIGHTING); } void resize(int w, int h){ glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(view.fovY, (double)w/(double)h, view.nearZ, view.farZ); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); width = w; height = h; } void setCamera(){ double pp = PAI / 180.0; view.pos[2] = view.cnt[2] + view.dist * cos(pp * view.theta) * cos(pp * view.phi);//z view.pos[0] = view.cnt[0] + view.dist * cos(pp * view.theta) * sin(pp * view.phi);//x view.pos[1] = view.cnt[1] + view.dist * sin(pp * view.theta);//y resize(width, height); } void idle(void){ glutPostRedisplay(); } void TexCreate(int NO,char* FileName){ glGenTextures(1, texName[NO]); texture[NO] = new TEXTURE(FileName); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); //テクスチャオブジェクトの作成 glBindTexture(GL_TEXTURE_2D, texName[NO]); //テクスチャの指定 glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,texture[NO]- Width,texture[NO]- Height,0,GL_RGBA,GL_UNSIGNED_BYTE,texture[NO]- image); //テクスチャの繰り返し方法の指定 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);//GL_CLAMP); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);//GL_CLAMP); //テクスチャを拡大・縮小する方法の指定 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);//NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);//NEAREST); glBindTexture(GL_TEXTURE_2D, 0); } void makeTexImage(int NO){ int i, j; for(j = 0; j TEX_HEIGHT; j++){ for(i = 0; i TEX_WIDTH; i++){ texImage[j][i][0] = (unsigned char)128; texImage[j][i][1] = (unsigned char)128; texImage[j][i][2] = (unsigned char)128; texImage[j][i][3] = (unsigned char)255; } } glBindTexture(GL_TEXTURE_2D, texName[NO]);//テクスチャをバインドする glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,TEX_WIDTH,TEX_HEIGHT,0,GL_RGBA,GL_UNSIGNED_BYTE,texImage); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);//NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);//NEAREST); glBindTexture(GL_TEXTURE_2D, 0);//バインドを解除 } void makeNormalMap(int NO, char* FileName){ //法線マップ用配列作成 int i, j, ip, jp; float r, g; texture[NO] = new TEXTURE(FileName); //BMPファイルから高さマップをロード for(j = 0; j TEX_HEIGHT; j++){ for(i = 0; i TEX_WIDTH; i++){ //高度マップを取得 normalMap[j][i][2] = ((texture[NO]- image[i*4+j*4 * TEX_WIDTH]) + (texture[NO]- image[i*4+j*4 * TEX_WIDTH+1]) + (texture[NO]- image[i*4+j*4 * TEX_WIDTH+2])) / 3; } } //高さマップから法線マップを作成 for(j = 0; j TEX_HEIGHT; j++){ jp = j+1; if(jp = TEX_HEIGHT) jp = 0; for(i = 0; i TEX_WIDTH; i++){ ip = i+1; if(ip = TEX_WIDTH) ip = 0; float deltaS = inv * (normalMap[j][ip][2] - normalMap[j][i][2]); float deltaT = inv * (normalMap[jp][i][2] - normalMap[j][i][2]); r = 127.5 + deltaS * fGrad; if(r 0.0) r = 0.0; if(r 255.0) r = 255.0; g = 127.5 + deltaT * fGrad; if(g 0.0) g = 0.0; if(g 255.0) g = 255.0; normalMap[j][i][0] = (GLubyte)r; normalMap[j][i][1] = (GLubyte)g; if(inv == -1.0) normalMap[j][i][2] = - normalMap[j][i][2]; } } glBindTexture(GL_TEXTURE_2D, texName[NO]);//テクスチャをバインドする glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,TEX_WIDTH,TEX_HEIGHT,0,GL_RGB,GL_UNSIGNED_BYTE,normalMap); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);//LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);//LINEAR); glBindTexture(GL_TEXTURE_2D, 0);//バインドを解除 } void init(void){ glClearColor(0.2, 0.2, 0.3, 1.0); setCamera(); setLight(); glEnable(GL_DEPTH_TEST); glEnable(GL_NORMALIZE); glsl.InitGLSL( vertex.shader , flagment.shader ); //テクスチャー作成 glGenTextures(6, texName); //普通に表示 TexCreate(0, brick128.png ); makeTexImage(1); //バンプマップ表示 TexCreate(2, brick128.png ); makeNormalMap(3, bump128.png ); } void drawBumpCube(float size, int nRepeatS, int nRepeatT){ float sz, s, t, tnt[3]; sz = 0.5 * size; float p[8][3] ={ { sz, sz, sz}, {-sz, sz, sz}, {-sz,-sz, sz}, { sz,-sz, sz}, { sz, sz,-sz}, {-sz, sz,-sz}, {-sz,-sz,-sz}, { sz,-sz,-sz} }; s = (float)nRepeatS; t = (float)nRepeatT; GLuint tangentLoc = glGetAttribLocation(glsl.ShaderProg, tangent ); glEnable(GL_TEXTURE_2D); glBegin(GL_QUADS); //top(z軸が鉛直軸のときz方向) tnt[0] = 0.0;tnt[1] = 1.0;tnt[2] = 0.0; glVertexAttrib3fv(tangentLoc, tnt); glNormal3f(0.0f,0.0f,1.0f); glTexCoord2f(0.0, 0.0); glVertex3fv(p[2]); glTexCoord2f( s , 0.0); glVertex3fv(p[3]); glTexCoord2f( s , t ); glVertex3fv(p[0]); glTexCoord2f(0.0, t ); glVertex3fv(p[1]); //x方向(正面) tnt[0] = 0.0; tnt[1] = 1.0; tnt[2] = 0.0; glVertexAttrib3fv(tangentLoc, tnt); glNormal3f(1.0f,0.0f,0.0f); glTexCoord2f( s , t ); glVertex3fv(p[0]); glTexCoord2f(0.0, t ); glVertex3fv(p[3]); glTexCoord2f(0.0, 0.0); glVertex3fv(p[7]); glTexCoord2f( s , 0.0); glVertex3fv(p[4]); //y方向 tnt[0] = 1.0; tnt[1] = 0.0; tnt[2] = 0.0; glVertexAttrib3fv(tangentLoc, tnt); glNormal3f(0.0f,1.0f,0.0f); glTexCoord2f(0.0, 0.0); glVertex3fv(p[1]); glTexCoord2f( s , 0.0); glVertex3fv(p[0]); glTexCoord2f( s , t ); glVertex3fv(p[4]); glTexCoord2f(0.0, t ); glVertex3fv(p[5]); //-x方向 tnt[0] = 0.0; tnt[1] = 1.0; tnt[2] = 0.0; glVertexAttrib3fv(tangentLoc, tnt); glNormal3f(-1.0f,0.0f,0.0f); glTexCoord2f(0.0, t ); glVertex3fv(p[6]); glTexCoord2f(0.0, 0.0); glVertex3fv(p[2]); glTexCoord2f( s , 0.0); glVertex3fv(p[1]); glTexCoord2f( s , t ); glVertex3fv(p[5]); //-y方向 tnt[0] = 1.0; tnt[1] = 0.0; tnt[2] = 0.0; glVertexAttrib3fv(tangentLoc, tnt); glNormal3f(0.0f,-1.0f,0.0f); glTexCoord2f(0.0, t ); glVertex3fv(p[2]); glTexCoord2f(0.0, 0.0); glVertex3fv(p[6]); glTexCoord2f( s , 0.0); glVertex3fv(p[7]); glTexCoord2f( s , t ); glVertex3fv(p[3]); //-z方向 tnt[0] = -1.0; tnt[1] = 0.0; tnt[2] = 0.0; glVertexAttrib3fv(tangentLoc, tnt); glNormal3f(0.0f,0.0f,-1.0f); glTexCoord2f(0.0, 0.0); glVertex3fv(p[7]); glTexCoord2f( s , 0.0); glVertex3fv(p[6]); glTexCoord2f( s , t ); glVertex3fv(p[5]); glTexCoord2f(0.0, t ); glVertex3fv(p[4]); glEnd(); glDisable(GL_TEXTURE_2D); } void DrawBox(void){ float ambient[] = { 0.3, 0.3, 0.3, 1.0}; float diffuse[] = { 0.7, 0.7, 0.7, 1.0}; float specular[]= { 0.5, 0.5, 0.5, 1.0}; if(flagShadow){ glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,shadowDiffuse); glMaterialfv(GL_FRONT,GL_SPECULAR,shadowSpecular); }else{ glMaterialfv(GL_FRONT,GL_AMBIENT,ambient); glMaterialfv(GL_FRONT,GL_DIFFUSE,diffuse); glMaterialfv(GL_FRONT,GL_SPECULAR,specular); glMaterialf(GL_FRONT,GL_SHININESS,100); } glPushMatrix(); glTranslatef(pos[0][0], pos[0][1], pos[0][2]); glRotatef(angle[0][2], 0.0, 0.0, 1.0);//z軸回転 glRotatef(angle[0][1], 0.0, 1.0, 0.0);//y軸回転 glRotatef(angle[0][0] + ang, 1.0, 0.0, 0.0);//x軸回転 glScalef(scale[0][0], scale[0][1], scale[0][2]); //オブジェクト形状 if(!flagShadow){ drawBumpCube(1.0, 1, 1); }else{//影表示のときはTextureを付けない drawCube(1.0); } glPopMatrix(); } void DrawBumpBox(void){ float ambient[] = { 0.3, 0.3, 0.3, 1.0}; float diffuse[] = { 0.7, 0.7, 0.7, 1.0}; float specular[]= { 0.5, 0.5, 0.5, 1.0}; if(flagShadow){ glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,shadowDiffuse); glMaterialfv(GL_FRONT,GL_SPECULAR,shadowSpecular); }else{ glMaterialfv(GL_FRONT,GL_AMBIENT,ambient); glMaterialfv(GL_FRONT,GL_DIFFUSE,diffuse); glMaterialfv(GL_FRONT,GL_SPECULAR,specular); glMaterialf(GL_FRONT,GL_SHININESS,100); } glPushMatrix(); glTranslatef(-pos[0][0], pos[0][1], pos[0][2]); glRotatef(angle[0][2], 0.0, 0.0, 1.0);//z軸回転 glRotatef(angle[0][1], 0.0, 1.0, 0.0);//y軸回転 glRotatef(angle[0][0] + ang, 1.0, 0.0, 0.0);//x軸回転 glScalef(scale[0][0], scale[0][1], scale[0][2]); //オブジェクト形状 if(!flagShadow){ drawBumpCube(1.0, 1, 1); }else{//影表示のときはTextureを付けない drawCube(1.0); } glPopMatrix(); } void drawFloor(float widthX, float widthZ, int nx, int nz){ int i, j; //Floor1枚当たりの幅 float wX = widthX / (float)nx; float wZ = widthZ / (float)nz; float diffuse[][4] = {{ 0.7f, 0.7f, 0.7f, 1.0f}, { 0.1f, 0.1f, 0.1f, 1.0f} }; float ambient[] = { 0.2f, 0.2f, 0.2f, 1.0f}; float specular[]= { 0.5f, 0.5f, 0.5f, 1.0f}; glMaterialfv(GL_FRONT,GL_AMBIENT,ambient); glMaterialfv(GL_FRONT,GL_SPECULAR,specular); glMaterialf(GL_FRONT,GL_SHININESS,100); glNormal3f(0.0f, 1.0f, 0.0f); glPushMatrix(); for (j = 0; j nz; j++) { float z1 = -widthZ / 2.0f + wZ * j; float z2 = z1 + wZ; for (i = 0; i nx; i++) { float x1 = -widthX / 2.0f + wX * i; float x2 = x1 + wX; glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse[(i + j) 1]); glBegin(GL_QUADS); glVertex3f(x1, 0.0f, z1); glVertex3f(x1, 0.0f, z2); glVertex3f(x2, 0.0f, z2); glVertex3f(x2, 0.0f, z1); glEnd(); } } glPopMatrix(); } void CalcShadowMat(int ID, float* mat){ float ex, ey, ez;//光源の方向 float a, b, c, d;//床の面のパラメータ float s; //object中心から光源までの距離 float x, y, z; x = lightPos[0] - pos[ID][0]; y = lightPos[1] - pos[ID][1]; z = lightPos[2] - pos[ID][2]; //光源の方向ベクトル s = sqrt(x * x + y * y + z * z); ex = x / s; ey = y / s; ez = z / s; //フロアの方向ベクトル(y方向) a = 0.0; b = 1.0; c = 0.0; d = -0.001; //フロアと影の干渉を防ぐため //shadow matrix mat[0] = b * ey + c * ez; mat[1] = -a * ey; mat[2] = -a * ez; mat[3] = 0.0; mat[4] = -b * ex; mat[5] = a * ex + c * ez; mat[6] = -b * ez; mat[7] = 0.0; mat[8] = -c * ex; mat[9] = -c * ey; mat[10] = a * ex + b * ey; mat[11] = 0.0; mat[12] = -d * ex; mat[13] = -d * ey; mat[14] = -d * ez; mat[15] = a * ex + b * ey + c * ez; } void drawShadow(){ //計算は平行光線に対する影 //オブジェクトごとに光源の方向を変え、疑似的に点光源に対する影を作る float mat[16]; //影行列の要素 flagShadow = true; glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glDepthMask(GL_FALSE); //影の描画 CalcShadowMat(0, mat); glPushMatrix(); glMultMatrixf(mat);//マトリクスの乗算 DrawBox();//オブジェクトの描画 glPopMatrix(); CalcShadowMat(1, mat); glPushMatrix(); glMultMatrixf(mat);//マトリクスの乗算 DrawBumpBox();//オブジェクトの描画 glPopMatrix(); //影の描画終了 glDepthMask(GL_TRUE); glDisable(GL_BLEND); flagShadow = false; } void display(void){ //時間計測 static double time1, time2, drawTime, frame; if(ang = 0.001) time1 = timeGetTime(); //カラーバッファ,デプスバッファのクリア glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity();//視点を変えるときはこの位置に必要 if(cos(PAI * view.theta /180.0) = 0.0)//カメラ仰角90度でビューアップベクトル切替 gluLookAt(view.pos[0], view.pos[1], view.pos[2], view.cnt[0], view.cnt[1], view.cnt[2], 0.0, 1.0, 0.0); else gluLookAt(view.pos[0], view.pos[1], view.pos[2], view.cnt[0], view.cnt[1], view.cnt[2], 0.0, -1.0, 0.0); //光源設定// l を押した後光源位置可変 glLightfv(GL_LIGHT0, GL_POSITION, lightPos); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, texName[0]); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, texName[1]); glActiveTexture(GL_TEXTURE2); glBindTexture(GL_TEXTURE_2D, texName[2]); glActiveTexture(GL_TEXTURE3); glBindTexture(GL_TEXTURE_2D, texName[3]); // シェーダプログラムの適用 glUseProgram(glsl.ShaderProg); //描画 //fragment shaderのユニフォーム変数のインデックスを取得 GLint texColorLoc = glGetUniformLocation(glsl.ShaderProg, colorMap ); GLint texNormalLoc = glGetUniformLocation(glsl.ShaderProg, normalMap ); glUniform1i(texColorLoc, 0);//GL_TEXTURE0を適用 glUniform1i(texNormalLoc, 1);//GL_TEXTURE1を適用 DrawBox(); glUniform1i(texColorLoc, 2);//GL_TEXTURE2を適用 glUniform1i(texNormalLoc, 3);//GL_TEXTURE3を適用 DrawBumpBox(); // シェーダプログラムの適用を解除 glUseProgram(0); drawFloor(10.0, 10.0, 5, 5); //影 drawShadow(); //回転角度更新 ang += dang; if(ang = 360.0){ time2 = timeGetTime(); //1回転当たりの描画時間 drawTime = (time2 - time1) * 0.001; frame = (360.0 / dang) / drawTime; printf( フレーム数 = %4.4f[fps] \n , frame); //フレームあたりの描画時間 drawTime = 1.0 / frame; printf( 描画時間 = %4.4f[spf] \n , drawTime); ang = 0.0; } //終了 glutSwapBuffers(); } //以下の3個の関数はマウス操作による視点の変更に必要 void mouse(int button, int state, int x, int y){ double pp = PAI / 180.0; if(button == GLUT_LEFT_BUTTON state == GLUT_DOWN){ xStart = x; yStart = y; flagMouse = true; if(x width/4 x 3*width/4 y height/4 y 3*height/4)//dolly { } }else if(button == GLUT_RIGHT_BUTTON state == GLUT_DOWN){ if(x width/4 x 3*width/4 y height/4 y 3*height/4)//dolly { }else if(( x width/4 || x 3*width/4) (y height/4 y 3*height/4)){ if(x width/4 ) view.phi -= 1.0; else view.phi += 1.0; view.cnt[2] = view.pos[2] - view.dist * cos(pp * view.phi) * cos(pp * view.theta); view.cnt[0] = view.pos[0] - view.dist * sin(pp * view.phi) * cos(pp * view.theta); }else if((x width/4 x 3*width/4) (y height/4 || y 3*height/4)){ if( y height/4) view.theta += 1.0; else view.theta -= 1.0; view.cnt[2] = view.pos[2] - view.dist * cos(pp * view.theta) * cos(pp * view.phi); view.cnt[0] = view.pos[0] - view.dist * cos(pp * view.theta) * sin(pp * view.phi); view.cnt[1] = view.pos[1] - view.dist * sin(pp * view.theta); } else if(x width/8 y 7*height/8) view.fovY -= 1.0;//zoom in else if(x 7*width/8 y 7*height/8) view.fovY += 1.0;//zoom out } else flagMouse = false; if(state == GLUT_DOWN) setCamera(); } void motion(int x, int y){ if(!flagMouse) return; if(cos(PAI * view.theta /180.0) = 0.0) view.phi -= 0.5 * (float)(x - xStart) ;//tumble else view.phi += 0.5 * (float)(x - xStart) ;//tumble view.theta += 0.5 * (float)(y - yStart) ;//crane setCamera(); xStart = x; yStart = y; } void main(int argc, char** argv){ glutInit( argc, argv); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); glutInitWindowSize(width, height); glutInitWindowPosition(100, 100); glutCreateWindow( バンプマッピング ); glutReshapeFunc(resize); glutDisplayFunc(display); glutMouseFunc(mouse); glutMotionFunc(motion); glutIdleFunc(idle); init(); glutMainLoop(); glDeleteTextures(6, texName); }