Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
thrree.js入門
Search
kaidouji85
June 16, 2017
Technology
1.5k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
thrree.js入門
kaidouji85
June 16, 2017
More Decks by kaidouji85
See All by kaidouji85
AbortControllerでPromiseをキャンセルする
kaidouji85
0
42
一発芸!!なんちゃってローカライズ
kaidouji85
0
110
AWSだけでネット対戦できるブラウザゲームを作った話
kaidouji85
0
92
GitHub CopilotでJavaScript開発効率を爆上げする
kaidouji85
0
130
Serverless + Fargate構成で継続的デリバリーの速度を劇的に改善した話
kaidouji85
0
1k
サーバーレスアーキテクチャこそ"ヘキサゴナルアーキテクチャ"
kaidouji85
0
120
サーバーレスでターンベース制のネット対戦ゲームを作った話
kaidouji85
0
670
CDKで構築したFargateのデプロイ時間を改善した話
kaidouji85
2
600
ブラウザゲームで視聴者参加型のゲーム配信
kaidouji85
0
400
Other Decks in Technology
See All in Technology
全社でのソフトウェアサプライチェーン攻撃対策をやってみた with Takumi Guard
z63d
0
270
Webの技術とガジェットで子どもも大人も楽しめるワクワク体験を提供する / Qiita Tech Festa Day 2026
you
PRO
1
150
10年目を迎えた「ABEMA」がどのように AI 活用を推進して、AI 駆動開発にシフトしているのか / How ABEMA, entering its 10th year, is promoting the use of AI and shifting toward AI-driven development
miyukki
0
370
そのドキュメント、自動化しませんか?
yuksew
1
410
プロダクト開発組織の現在地(Ver.2026/07) / product-organization
kaonavi
0
400
どこまでAIに任せるか 〜確率論と決定論の境界決定〜
shukob
0
450
41歳でAWSが好きすぎてITエンジニアになったおっさんの話
yama3133
1
740
GoでCコンパイラを作った話
repunit
0
150
非定型なドキュメントを効率よくリファクタする 〜えぇ!?仕様書27本の移行が1日で終わったって!?〜
subroh0508
2
610
複数プロダクトで進めるAI機能実装 ── 実践から得たリアルな学びとロードマップ実現への挑戦 / AICon2026_yanari
rakus_dev
1
270
ファミコンでPHPを動かす / PHP on the Famicom
tomzoh
2
610
それでも、技術なブログを書く理由 #kichijojipm / Why I Still Write Tech Blogs Even Now
shinkufencer
0
410
Featured
See All Featured
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
410
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
620
Test your architecture with Archunit
thirion
1
2.3k
Un-Boring Meetings
codingconduct
0
350
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
64
56k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.2k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2k
Building Flexible Design Systems
yeseniaperezcruz
330
40k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.4k
Leo the Paperboy
mayatellez
8
1.9k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
Transcript
UISFFKTೖ ϓϩάϥϛϯάੜ์ૹษڧձୈճ !αΠϘζגࣜձࣾদࢁΦϑΟε ɹ༎հ
ࣗݾհ ɹ༎հ ϓϩάϥϚʔͬͯ·͢ +4͕େ͖Ͱ͢ ϓϩੜͪΌΜՄѪ͍ʂʂ
দࢁͱ͍͑ळࢁܑఋ
ळࢁܑఋͱ͍͑ઓ؋ࡾּ
ࡾּ UISFF
ͱ͍͏༁Ͱ UISFFKTͷΛ͠·͢
ΞδΣϯμ UISFFKTΛ͏ཧ༝ UISFFKTೖ %ϓϩάϥϛϯάUJQT ·ͱΊ
ΞδΣϯμ UISFFKTΛ͏ཧ༝ UISFFKTೖ %ϓϩάϥϛϯάUJQT ·ͱΊ
UISFFKTͱ +BWB4DSJQUͰ%͕؆୯ʹ͑ΔΑ͏ʹͳΔ ϥΠϒϥϦͰ͢ +BWB4DSJQUʹ8FC(-ͱ͍͏ඪ४Ͱ %Λѻ͏ػೳ͕͋Γ·͢ 8FC(-Λ͏ͷେมͰ͢ ˢԿނ͔ͱݴ͏ͱɺͦΕʜʜ
8FC(-㱠+BWB4DSJQU
γΣʔμʔݴޠ 8FH(-Λ͏ʹ+BWB4DSJQUͱશʹผͷ γΣʔμʔݴޠΛֶͿඞཁ͕͋Γ·͢ +4෦ߦྻܭࢉ͕ଟͯ͘େมͰ͢ attribute vec3 aVertexPosition; uniform mat4 uMVMatrix;
uniform mat4 uPMatrix; void main(void) { gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0); }
UISFFKTͰָͯ͠ 8FC(-Λ͍·͠ΐ͏
ΞδΣϯμ UISFFKTΛ͏ཧ༝ UISFFKTೖ %ϓϩάϥϛϯάUJQT ·ͱΊ
UISFFKTͰIFMMPXPSME ཱํମΛදࣔ͢ΔϓϩάϥϜΛ࡞Γ·͢ ιʔεͪ͜Βʹ͋Γ·͢ IUUQTHJUIVCDPNLBJEPVKJIFMMPUISFFKT
var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera(
75, window.innerWidth/ window.innerHeight, 0.1, 1000 ); var renderer = new THREE.WebGLRenderer(); renderer.setSize( window.innerWidth, window.innerHeight ); document.body.appendChild( renderer.domElement ); var geometry = new THREE.BoxGeometry( 1, 1, 1 ); var material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } ); var cube = new THREE.Mesh( geometry, material ); scene.add( cube ); camera.position.z = 5; var render = function () { requestAnimationFrame( render ); cube.rotation.x += 0.1; cube.rotation.y += 0.1; renderer.render(scene, camera); }; render();
Կ͜Εɺ ҙຯ͔Μͳ͍
େৎɺ %ʹऀ͕ଟ͍ͷͰ ͘͠ݟ͑Δ͚ͩͰ͢
UISFFKTͷओͳऀ 3FOEFS 4DFOF $BNFSB (FPNFUSZ .FTI .BUFSJBM
UISFFKTͷओͳऀ 3FOEFS 4DFOF $BNFSB (FPNFUSZ .FTI .BUFSJBM
3FOEFS ϒϥβʹ%ը໘Λඳը͢Δͷ 3FOEFSҎԼύϥϝʔλͰ%ඳը͠·͢ 4DFOF %ମ͕ஔ͔Ε͍ͯΔੈք $BNFSB 3FOEFSΛࣸਅʹྫ͑Δͱ͔Γ͍͢Ͱ͢
3FOEFS 4DFOF $BNFSB
UISFFKTͷओͳऀ 3FOEFS 4DFOF $BNFSB (FPNFUSZ .FTI .BUFSJBM
$BNFSB %ۭؒΛࡱӨ͢ΔΧϝϥͰ͢ ݱ࣮ͷΧϝϥಉ༷ɺ༻్ʹԠͯ͡৭ʑͳͷ͕ ͋Γ·͢ αϯϓϧίʔυͰ1FSTQFDUJWF$BNFSB ಁࢹӨΧϝϥ Λ͍ͬͯ·͢ IUUQTXXXBUXJLJKQUISFFKTQBHFT IUNM
UISFFKTͷओͳऀ 3FOEFS 4DFOF $BNFSB (FPNFUSZ .FTI .BUFSJBM
4DFOF %ϞσϧɺޫݯͳͲΛஔ͢ΔͷͰ͢ %ۭؒͷੈքͦͷͷͰ͢
UISFFKTͷओͳऀ 3FOEFS 4DFOF $BNFSB (FPNFUSZ .FTI .BUFSJBM
.FTI %ۭؒʹஔ͢ΔମͰ͢ ΩϟϥΫλʔɺՈɺϏϧͳͲͷഎܠͳͲ͕ .FTIʹ֘͠·͢
.FTI (FPNFUSZ .BUFSJBM ܗঢ় ɹ৭ ɹࡐ࣭ ɹςΫενϟ
UISFFKTͷओͳऀ 3FOEFS 4DFOF $BNFSB (FPNFUSZ .FTI .BUFSJBM
(FPNFUSZ ମͷܗঢ়σʔλ αϯϓϧϓϩάϥϜͰཱํମΛ͍ͬͯΔ ଞʹฏ໘ɺٿମͳͲجຊతͳܗ͕ ༻ҙ͞Ε͍ͯΔ
UISFFKTͷओͳऀ 3FOEFS 4DFOF $BNFSB (FPNFUSZ .FTI .BUFSJBM
.BUFSJBM ମͷࡐ࣭ΛܾΊΔͷ ৭ɺޫͷࣹ۩߹ɺෆಁ໌ͳͲΛઃఆͰ͖Δ ςΫενϟͷઃఆΛ͢Δͷ͜͜
͏Ұαϯϓϧίʔυ ΛݟͯΈ·͠ΐ͏
var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera(
75, window.innerWidth/ window.innerHeight, 0.1, 1000 ); var renderer = new THREE.WebGLRenderer(); renderer.setSize( window.innerWidth, window.innerHeight ); document.body.appendChild( renderer.domElement ); var geometry = new THREE.BoxGeometry( 1, 1, 1 ); var material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } ); var cube = new THREE.Mesh( geometry, material ); scene.add( cube ); camera.position.z = 5; var render = function () { requestAnimationFrame( render ); cube.rotation.x += 0.1; cube.rotation.y += 0.1; renderer.render(scene, camera); }; render();
var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera(
75, window.innerWidth/ window.innerHeight, 0.1, 1000 ); var renderer = new THREE.WebGLRenderer(); renderer.setSize( window.innerWidth, window.innerHeight ); document.body.appendChild( renderer.domElement ); var geometry = new THREE.BoxGeometry( 1, 1, 1 ); var material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } ); var cube = new THREE.Mesh( geometry, material ); scene.add( cube ); camera.position.z = 5; var render = function () { requestAnimationFrame( render ); cube.rotation.x += 0.1; cube.rotation.y += 0.1; renderer.render(scene, camera); }; render(); UISFFKTͷऀΛ ॳظԽͯ͠Δ͚ͩ
var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera(
75, window.innerWidth/ window.innerHeight, 0.1, 1000 ); var renderer = new THREE.WebGLRenderer(); renderer.setSize( window.innerWidth, window.innerHeight ); document.body.appendChild( renderer.domElement ); var geometry = new THREE.BoxGeometry( 1, 1, 1 ); var material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } ); var cube = new THREE.Mesh( geometry, material ); scene.add( cube ); camera.position.z = 5; var render = function () { requestAnimationFrame( render ); cube.rotation.x += 0.1; cube.rotation.y += 0.1; renderer.render(scene, camera); }; render();
var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera(
75, window.innerWidth/ window.innerHeight, 0.1, 1000 ); var renderer = new THREE.WebGLRenderer(); renderer.setSize( window.innerWidth, window.innerHeight ); document.body.appendChild( renderer.domElement ); var geometry = new THREE.BoxGeometry( 1, 1, 1 ); var material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } ); var cube = new THREE.Mesh( geometry, material ); scene.add( cube ); camera.position.z = 5; var render = function () { requestAnimationFrame( render ); cube.rotation.x += 0.1; cube.rotation.y += 0.1; renderer.render(scene, camera); }; render(); ͋ͱ͜ͷ෦͕ Α͔͘Βͳ͍
͍͜͜ΘΏΔ ήʔϜϧʔϓͰ͢
ήʔϜϧʔϓͱ ήʔϜը໘ΛΞχϝʔγϣϯͤ͞ΔΈ ήʔϜը໘ύϥύϥອըͷཁྖͰɺ ΞχϝʔγϣϯΛ͍ͯ͠Δ ύϥύϥອըΛϓϩάϥϜͰ࠶ݱ͢Δͱɺ ແݶϧʔϓʹͳΔ
SFRVFTU"OJNBUJPO'SBNF ϒϥβͰήʔϜϧʔϓΛ࣮ݱ͢Δͱ͖ʹ ͏ؔ ಈ͖ͱͯ͠ɺϒϥβը໘࠶ඳըલʹ ొͨ͠ίʔϧόοΫؔΛݺͿͱݴ͏ͷ IUUQTEFWFMPQFSNP[JMMBPSHKBEPDT8FC "1*8JOEPXSFRVFTU"OJNBUJPO'SBNF
ήʔϜϧʔϓ࣮ݱํ๏ var render = function () { requestAnimationFrame( render );
cube.rotation.x += 0.1; cube.rotation.y += 0.1; renderer.render(scene, camera); }; render(); ᶃSFOEFSΛ࣮ߦ ᶄSFRVFTU"OJNBUJPO'SBNFʹSFOEFSΛొ ᶅSFOEFS͕ؔऴྃ͢Δ ᶆϒϥβ࠶ඳըલʹSFOEFS͕ݺΕΔ ᶃʹΔ
ήʔϜϧʔϓͷॲཧ var render = function () { requestAnimationFrame( render );
cube.rotation.x += 0.1; cube.rotation.y += 0.1; renderer.render(scene, camera); }; render(); ᶃ ᶄ ᶃཱํମͷYɺZ࣠ํͷճస֯Λ ͢Δ ᶄ%ը໘Λඳը͢Δ
UISFFKTجຊ·ͱΊ %ੈքͷجຊͱͳΔγʔϯɺͦͷੈքΛݟΔ ͨΊͷΧϝϥ ମͰ͋Δ.FTIɺܗঢ়σʔλ(FPNFUSZɺ ࡐ࣭σʔλ.BUFSJBM͔ΒΔ ήʔϜϧʔϓͱݺΕΔύϥύϥອըͷख๏Ͱɺ ήʔϜը໘͕ಈ͍͍ͯΔΑ͏ʹݟ͑Δ
৭ʑग़͖ͯ·͕ͨ͠ɺ
.FTI 3FOEFS 4DFOF $BNFSB (FPNFUSZ .BUFSJBM ·ͣओͳऀΛ ཧղ͠·͠ΐ͏
ΞδΣϯμ UISFFKTΛ͏ཧ༝ UISFFKTೖ %ϓϩάϥϛϯάUJQT ·ͱΊ
͡Ίʹ ͔͜͜ΒUJQTूʹͳΓ·͢ ൃදऀ͕ࣗ࡞ήʔϜΛ࡞ΔࡍʹಘͨݟΛ ڞ༗͠·͢ ࠷ऴతʹ͜Ε͘Β͍࡞ΕΔΑ͏ʹͳΓ·͢ IUUQTHPPHMEOZ23#
࡞ྫ खલຯͰ͕͢ʣ
࡞ྫͷίʔυ IUUQTHJUIVCDPNLBJEPVKJTUVEZUISFF KTDPNNJUTNBTUFS
UJQTҰཡ ϏϧϘʔυΛ࣮ݱ͢Δ εΧΠϘοΫεΛ࣮ݱ͢Δ ࣗ࡞ϞσϧΛಡΈࠐΉ
UJQTҰཡ ϏϧϘʔυΛ࣮ݱ͢Δ εΧΠϘοΫεΛ࣮ݱ͢Δ ࣗ࡞ϞσϧΛಡΈࠐΉ
ɹϏϧϘʔυͱ ৗʹΧϝϥͷํʹදࣔ͞ΕΔɺ ൘ঢ়ͷΦϒδΣΫτ %ۭؒʹ࣍ݩը૾Λද͍ࣔͤͨ࣌͞ʹɺ Α͘ΘΕ͍ͯ·͢ ࡞ྫͩͱɺϩϘοτɺ͕ϏϧϘʔυͰ͢ ࣮ࡏͷήʔϜͩͱɺϖʔύʔϚ˓Φ31(ɺ εύ˓ϘͳͲ
ϏϧϘʔυ࣮ํ๏ ϏϧϘʔυͷRVPUBOJPO ճస֯ ʹɺ ΧϝϥͷRVPUBOJPOΛηοτ͠·͠ΐ͏ ˢ্هॲཧΛΔͷɺήʔϜϧʔϓͷதͰ͢ mesh.quaternion.copy(camera.quaternion);
ͬͱৄ͍͠ίʔυྫ IUUQTHJUIVCDPNLBJEPVKJTUVEZUISFF KTCMPCNBTUFSTSDTUBHFTDIPPMTDIPPM CVJMEUSFFCJMMCPBSEKT
UJQTҰཡ ϏϧϘʔυΛ࣮ݱ͢Δ εΧΠϘοΫεΛ࣮ݱ͢Δ ࣗ࡞ϞσϧΛಡΈࠐΉ
εΧΠϘοΫεͱ ശͷଆʹԕܠͷը૾ΛషΓ͚ͯɺ ͞ແݶͷੈքʹ͍ΔΑ͏ʹࡨ֮ͤ͞Δख๏ ࡞ྫͰۭɺ໘ͳͲʹεΧΠϘοΫεΛ༻
εΧΠϘοΫε࡞ํ๏ ԕܠը૾ΛࣗͰඳ͘ͷେมͳͷͰɺ 5FSSBHFOΛ͍·͠ΐ͏ 5FSSBHFOͱ%Ͱ৭ʑͳܗΛ࡞Δ͜ͱ͕ Ͱ͖ΔιϑτͰ͢ ํ ্Լͷܭຕͷը૾Λ༻ҙ͠·͠ΐ͏
εΧΠϘοΫεը૾ྫ
۩ମతͳखॱ ʮ5FSBHHFOɺεΧΠϘοΫεʯͰάάΔͱ ݁ߏώοτ͠·͢ ݸਓతʹɺ͜ͷϒϩά͕Φεεϝ IUUQEIBUFOBOFKQ OBLBNVSB
UJQTҰཡ ϏϧϘʔυΛ࣮ݱ͢Δ εΧΠϘοΫεΛ࣮ݱ͢Δ ࣗ࡞ϞσϧΛಡΈࠐΉ
UISFFKTͷϞσϧϑΝΠϧ UISFFKTઐ༻ͷKTPOϑΝΠϧ͕͋Γ·͢ ༗໊ͳ%ιϑτʹݢฒΈUISFFKTઐ༻KTPOΛ ॻ͖ग़͢ϓϥάΠϯ͕͋Γ·͢ .FUBTFRVPJBɺ#MFOEFSΛࢼ͠·͕ͨ͠ɺ ͲͪΒ҆ఆ͠·ͤΜͰͨ͠
.FUBTFRVPJB ݴΘͣͱΕͨࠃ࢈ϞσϦϯάπʔϧ ඪ४ͰUISFFKTઐ༻KTPOͷग़ྗʹରԠ ςΫενϟ্͕Լٯ͞·ʹදࣔ͞ΕΔҎ֎ɺ ಛʹ͋Γ·ͤΜͰͨ͠
.FUBTFRVPJB UISFFKT ࣮ࡍͷঢ়
ෆ۩߹ͷճආࡦ ը૾ϑΝΠϧΛ্Լɺࠨӈٯʹ͢Ε ͳ͘දࣔͰ͖·͢ .FUBTFRVPJBެࣜ##4Ͱ࣭ͨ͠Βɺ ˢͷΑ͏ͳճΛ͖·ͨ͠
#MFOEFS ࠃࡍతʹ༗໊ͳ%ιϑτ ϑϦʔͳͷʹػೳ͕ϋΠΤϯυͳιϑτʹ ඖఢ͢Δ UISFFKTઐ༻KTPOΛॻ͖ग़͢ϓϥάΠϯ͕͋Δ ͕ɺͦͦϞσϧ͕දࣔ͞Εͳ͔ͬͨ
࠷ޙʹ͓·͚Ͱ
1SPKFDU%0("
1SPKFDU%PHBͱ ੵΈײ֮Ͱ%Ϟσϧ͕࡞ΕΔιϑτ ࠷ॳ͔Β༻ҙ͞Ε͍ͯΔύʔπ͕ଟͯ͘ɺ ૉਓͰͦΕͬΆ͍ͷ͕࡞ΕΔ ެࣜαΠτʹՃύʔπ͕͋ΔͷͰɺ શ෦ೖΕͨํ͕͍͍ ࡞ྫͷϩϘοτ͜ΕͰ࡞Γ·ͨ͠
None
None
None
ૉਓͰ ͜Ε͚ͩͷͷ͕ ࡞Ε·͢
%PHBҙ ͍ΘΏΔϩʔϙϦϞσϧͰͳ͍ͷͰɺ ήʔϜͰͦͷ··͏ʹෆ͖ ˢϏϧϘʔυͱͯ͠͏ͳΒશવ͋Γ ϝΧܥҎ֎গۤ͠ख ͔Δਓʹ%PHBͬͯΔͳͱҰൃͰόϨΔ
ΞδΣϯμ UISFFKTΛ͏ཧ༝ UISFFKTೖ %ϓϩάϥϛϯάUJQT ·ͱΊ
·ͱΊ UISFFKTͱ+BWB4DSJQUͰ؆୯ʹ%Λ ͏ͨΊͷϥΠϒϥϦͰ͋Δ UISFFKTʹऀ͕ͨ͘͞Μ͍ΔͷͰɺ ·ͣͦΕΒΛҰͭҰͭཧղ͠Α͏ .FUBTFRVPJBɺ5FSSBHFOɺ%PHBͳͲͰUISFFKT ༻ͷࣗ࡞ૉࡐΛͲΜͲΜ࡞Ζ͏
͝੩ௌ͋Γ͕ͱ͏ ͍͟͝·ͨ͠