CINXE.COM
Building up a basic demo with Three.js - 游戏开发 | MDN
<!doctype html><html lang="en-US" prefix="og: https://ogp.me/ns#"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><link rel="icon" href="https://developer.mozilla.org/favicon-48x48.bc390275e955dacb2e65.png"/><link rel="apple-touch-icon" href="https://developer.mozilla.org/apple-touch-icon.528534bba673c38049c2.png"/><meta name="theme-color" content="#ffffff"/><link rel="manifest" href="https://developer.mozilla.org/manifest.f42880861b394dd4dc9b.json"/><link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="MDN Web Docs"/><title>Building up a basic demo with Three.js - 游戏开发 | MDN</title><link rel="alternate" title="Building up a basic demo with Three.js" href="https://developer.mozilla.org/en-US/docs/Games/Techniques/3D_on_the_web/Building_up_a_basic_demo_with_Three.js" hrefLang="en"/><link rel="alternate" title="Aufbau eines einfachen Demos mit Three.js" href="https://developer.mozilla.org/de/docs/Games/Techniques/3D_on_the_web/Building_up_a_basic_demo_with_Three.js" hrefLang="de"/><link rel="alternate" title="Réaliser une démo basique avec Three.js" href="https://developer.mozilla.org/fr/docs/Games/Techniques/3D_on_the_web/Building_up_a_basic_demo_with_Three.js" hrefLang="fr"/><link rel="alternate" title="Three.js を使った基本的なデモの作成" href="https://developer.mozilla.org/ja/docs/Games/Techniques/3D_on_the_web/Building_up_a_basic_demo_with_Three.js" hrefLang="ja"/><link rel="alternate" title="Создание простой сцены с помощью Three.js" href="https://developer.mozilla.org/ru/docs/Games/Techniques/3D_on_the_web/Building_up_a_basic_demo_with_Three.js" hrefLang="ru"/><link rel="alternate" title="Building up a basic demo with Three.js" href="https://developer.mozilla.org/zh-CN/docs/Games/Techniques/3D_on_the_web/Building_up_a_basic_demo_with_Three.js" hrefLang="zh"/><link rel="preload" as="font" type="font/woff2" href="/static/media/Inter.var.c2fe3cb2b7c746f7966a.woff2" crossorigin=""/><link rel="alternate" type="application/rss+xml" title="MDN Blog RSS Feed" href="https://developer.mozilla.org/en-US/blog/rss.xml" hrefLang="en"/><meta name="description" content="游戏中一个典型的 3D 场景 (最简单的那种) 包含标准的物品比如在坐标轴中的形状,一个实际可看到他们的摄像机,灯光和材质让其看起来不错,动画使其生动等等。 Three.js, 和其他 3D 库一样,提供内置的 helper 函数来帮助你尽可能快地实现通用的 3D 功能 . 在这篇文章我们会带你了解使用 Three 的基本知识,包含设置开发者环境,必要的 HTML 结构,Three.js 对象基础,以及如何创建一个基本的 demo."/><meta property="og:url" content="https://developer.mozilla.org/zh-CN/docs/Games/Techniques/3D_on_the_web/Building_up_a_basic_demo_with_Three.js"/><meta property="og:title" content="Building up a basic demo with Three.js - 游戏开发 | MDN"/><meta property="og:type" content="website"/><meta property="og:locale" content="zh_CN"/><meta property="og:description" content="游戏中一个典型的 3D 场景 (最简单的那种) 包含标准的物品比如在坐标轴中的形状,一个实际可看到他们的摄像机,灯光和材质让其看起来不错,动画使其生动等等。 Three.js, 和其他 3D 库一样,提供内置的 helper 函数来帮助你尽可能快地实现通用的 3D 功能 . 在这篇文章我们会带你了解使用 Three 的基本知识,包含设置开发者环境,必要的 HTML 结构,Three.js 对象基础,以及如何创建一个基本的 demo."/><meta property="og:image" content="https://developer.mozilla.org/mdn-social-share.d893525a4fb5fb1f67a2.png"/><meta property="og:image:type" content="image/png"/><meta property="og:image:height" content="1080"/><meta property="og:image:width" content="1920"/><meta property="og:image:alt" content="The MDN Web Docs logo, featuring a blue accent color, displayed on a solid black background."/><meta property="og:site_name" content="MDN Web Docs"/><meta name="twitter:card" content="summary_large_image"/><meta name="twitter:creator" content="MozDevNet"/><link rel="canonical" href="https://developer.mozilla.org/zh-CN/docs/Games/Techniques/3D_on_the_web/Building_up_a_basic_demo_with_Three.js"/><style media="print">.article-actions-container,.document-toc-container,.language-menu,.main-menu-toggle,.on-github,.page-footer,.place,.sidebar,.top-banner,.top-navigation-main,ul.prev-next{display:none!important}.main-page-content,.main-page-content pre{padding:2px}.main-page-content pre{border-left-width:2px}</style><script src="/static/js/gtag.js" defer=""></script><script defer="" src="/static/js/main.1ac238e4.js"></script><link href="/static/css/main.4634a21c.css" rel="stylesheet"/></head><body><script>if(document.body.addEventListener("load",(t=>{t.target.classList.contains("interactive")&&t.target.setAttribute("data-readystate","complete")}),{capture:!0}),window&&document.documentElement){const t={light:"#ffffff",dark:"#1b1b1b"};try{const e=window.localStorage.getItem("theme");e&&(document.documentElement.className=e,document.documentElement.style.backgroundColor=t[e]);const o=window.localStorage.getItem("nop");o&&(document.documentElement.dataset.nop=o)}catch(t){console.warn("Unable to read theme from localStorage",t)}}</script><div id="root"><ul id="nav-access" class="a11y-nav"><li><a id="skip-main" href="#content">Skip to main content</a></li><li><a id="skip-search" href="#top-nav-search-input">Skip to search</a></li><li><a id="skip-select-language" href="#languages-switcher-button">Skip to select language</a></li></ul><div class="page-wrapper document-page"><div class="top-banner loading"><section class="place top container"></section></div><div class="sticky-header-container"><header class="top-navigation "><div class="container "><div class="top-navigation-wrap"><a href="/zh-CN/" class="logo" aria-label="MDN homepage"><svg id="mdn-docs-logo" xmlns="http://www.w3.org/2000/svg" x="0" y="0" viewBox="0 0 694.9 104.4" style="enable-background:new 0 0 694.9 104.4" xml:space="preserve" role="img"><title>MDN Web Docs</title><path d="M40.3 0 11.7 92.1H0L28.5 0h11.8zm10.4 0v92.1H40.3V0h10.4zM91 0 62.5 92.1H50.8L79.3 0H91zm10.4 0v92.1H91V0h10.4z" class="logo-m"></path><path d="M627.9 95.6h67v8.8h-67v-8.8z" class="logo-_"></path><path d="M367 42h-4l-10.7 30.8h-5.5l-10.8-26h-.4l-10.5 26h-5.2L308.7 42h-3.8v-5.6H323V42h-6.5l6.8 20.4h.4l10.3-26h4.7l11.2 26h.5l5.7-20.3h-6.2v-5.6H367V42zm34.9 20c-.4 3.2-2 5.9-4.7 8.2-2.8 2.3-6.5 3.4-11.3 3.4-5.4 0-9.7-1.6-13.1-4.7-3.3-3.2-5-7.7-5-13.7 0-5.7 1.6-10.3 4.7-14s7.4-5.5 12.9-5.5c5.1 0 9.1 1.6 11.9 4.7s4.3 6.9 4.3 11.3c0 1.5-.2 3-.5 4.7h-25.6c.3 7.7 4 11.6 10.9 11.6 2.9 0 5.1-.7 6.5-2 1.5-1.4 2.5-3 3-4.9l6 .9zM394 51.3c.2-2.4-.4-4.7-1.8-6.9s-3.8-3.3-7-3.3c-3.1 0-5.3 1-6.9 3-1.5 2-2.5 4.4-2.8 7.2H394zm51 2.4c0 5-1.3 9.5-4 13.7s-6.9 6.2-12.7 6.2c-6 0-10.3-2.2-12.7-6.7-.1.4-.2 1.4-.4 2.9s-.3 2.5-.4 2.9h-7.3c.3-1.7.6-3.5.8-5.3.3-1.8.4-3.7.4-5.5V22.3h-6v-5.6H416v27c1.1-2.2 2.7-4.1 4.7-5.7 2-1.6 4.8-2.4 8.4-2.4 4.6 0 8.4 1.6 11.4 4.7 3 3.2 4.5 7.6 4.5 13.4zm-7.7.6c0-4.2-1-7.4-3-9.5-2-2.2-4.4-3.3-7.4-3.3-3.4 0-6 1.2-8 3.7-1.9 2.4-2.9 5-3 7.7V57c0 3 1 5.6 3 7.7s4.5 3.1 7.6 3.1c3.6 0 6.3-1.3 8.1-3.9 1.8-2.7 2.7-5.9 2.7-9.6zm69.2 18.5h-13.2v-7.2c-1.2 2.2-2.8 4.1-4.9 5.6-2.1 1.6-4.8 2.4-8.3 2.4-4.8 0-8.7-1.6-11.6-4.9-2.9-3.2-4.3-7.7-4.3-13.3 0-5 1.3-9.6 4-13.7 2.6-4.1 6.9-6.2 12.8-6.2 5.7 0 9.8 2.2 12.3 6.5V22.3h-8.6v-5.6h15.8v50.6h6v5.5zM493.2 56v-4.4c-.1-3-1.2-5.5-3.2-7.3s-4.4-2.8-7.2-2.8c-3.6 0-6.3 1.3-8.2 3.9-1.9 2.6-2.8 5.8-2.8 9.6 0 4.1 1 7.3 3 9.5s4.5 3.3 7.4 3.3c3.2 0 5.8-1.3 7.8-3.8 2.1-2.6 3.1-5.3 3.2-8zm53.1-1.4c0 5.6-1.8 10.2-5.3 13.7s-8.2 5.3-13.9 5.3-10.1-1.7-13.4-5.1c-3.3-3.4-5-7.9-5-13.5 0-5.3 1.6-9.9 4.7-13.7 3.2-3.8 7.9-5.7 14.2-5.7s11 1.9 14.1 5.7c3 3.7 4.6 8.1 4.6 13.3zm-7.7-.2c0-4-1-7.2-3-9.5s-4.8-3.5-8.2-3.5c-3.6 0-6.4 1.2-8.3 3.7s-2.9 5.6-2.9 9.5c0 3.7.9 6.8 2.8 9.4 1.9 2.6 4.6 3.9 8.3 3.9 3.6 0 6.4-1.3 8.4-3.8 1.9-2.6 2.9-5.8 2.9-9.7zm45 5.8c-.4 3.2-1.9 6.3-4.4 9.1-2.5 2.9-6.4 4.3-11.8 4.3-5.2 0-9.4-1.6-12.6-4.8-3.2-3.2-4.8-7.7-4.8-13.7 0-5.5 1.6-10.1 4.7-13.9 3.2-3.8 7.6-5.7 13.2-5.7 2.3 0 4.6.3 6.7.8 2.2.5 4.2 1.5 6.2 2.9l1.5 9.5-5.9.7-1.3-6.1c-2.1-1.2-4.5-1.8-7.2-1.8-3.5 0-6.1 1.2-7.7 3.7-1.7 2.5-2.5 5.7-2.5 9.6 0 4.1.9 7.3 2.7 9.5 1.8 2.3 4.4 3.4 7.8 3.4 5.2 0 8.2-2.9 9.2-8.8l6.2 1.3zm34.7 1.9c0 3.6-1.5 6.5-4.6 8.5s-7 3-11.7 3c-5.7 0-10.6-1.2-14.6-3.6l1.2-8.8 5.7.6-.2 4.7c1.1.5 2.3.9 3.6 1.1s2.6.3 3.9.3c2.4 0 4.5-.4 6.5-1.3 1.9-.9 2.9-2.2 2.9-4.1 0-1.8-.8-3.1-2.3-3.8s-3.5-1.3-5.8-1.7-4.6-.9-6.9-1.4c-2.3-.6-4.2-1.6-5.7-2.9-1.6-1.4-2.3-3.5-2.3-6.3 0-4.1 1.5-6.9 4.6-8.5s6.4-2.4 9.9-2.4c2.6 0 5 .3 7.2.9 2.2.6 4.3 1.4 6.1 2.4l.8 8.8-5.8.7-.8-5.7c-2.3-1-4.7-1.6-7.2-1.6-2.1 0-3.7.4-5.1 1.1-1.3.8-2 2-2 3.8 0 1.7.8 2.9 2.3 3.6 1.5.7 3.4 1.2 5.7 1.6 2.2.4 4.5.8 6.7 1.4 2.2.6 4.1 1.6 5.7 3 1.4 1.6 2.2 3.7 2.2 6.6zM197.6 73.2h-17.1v-5.5h3.8V51.9c0-3.7-.7-6.3-2.1-7.9-1.4-1.6-3.3-2.3-5.7-2.3-3.2 0-5.6 1.1-7.2 3.4s-2.4 4.6-2.5 6.9v15.6h6v5.5h-17.1v-5.5h3.8V51.9c0-3.8-.7-6.4-2.1-7.9-1.4-1.5-3.3-2.3-5.6-2.3-3.2 0-5.5 1.1-7.2 3.3-1.6 2.2-2.4 4.5-2.5 6.9v15.8h6.9v5.5h-20.2v-5.5h6V42.4h-6.1v-5.6h13.4v6.4c1.2-2.1 2.7-3.8 4.7-5.2 2-1.3 4.4-2 7.3-2s5.3.7 7.5 2.1c2.2 1.4 3.7 3.5 4.5 6.4 1.1-2.5 2.7-4.5 4.9-6.1s4.8-2.4 7.9-2.4c3.5 0 6.5 1.1 8.9 3.3s3.7 5.6 3.7 10.2v18.2h6.1v5.5zm42.5 0h-13.2V66c-1.2 2.2-2.8 4.1-4.9 5.6-2.1 1.6-4.8 2.4-8.3 2.4-4.8 0-8.7-1.6-11.6-4.9-2.9-3.2-4.3-7.7-4.3-13.3 0-5 1.3-9.6 4-13.7 2.6-4.1 6.9-6.2 12.8-6.2s9.8 2.2 12.3 6.5V22.7h-8.6v-5.6h15.8v50.6h6v5.5zm-13.3-16.8V52c-.1-3-1.2-5.5-3.2-7.3s-4.4-2.8-7.2-2.8c-3.6 0-6.3 1.3-8.2 3.9-1.9 2.6-2.8 5.8-2.8 9.6 0 4.1 1 7.3 3 9.5s4.5 3.3 7.4 3.3c3.2 0 5.8-1.3 7.8-3.8 2.1-2.6 3.1-5.3 3.2-8zm61.5 16.8H269v-5.5h6V51.9c0-3.7-.7-6.3-2.2-7.9-1.4-1.6-3.4-2.3-5.7-2.3-3.1 0-5.6 1-7.4 3s-2.8 4.4-2.9 7v15.9h6v5.5h-19.3v-5.5h6V42.4h-6.2v-5.6h13.6V43c2.6-4.6 6.8-6.9 12.7-6.9 3.6 0 6.7 1.1 9.2 3.3s3.7 5.6 3.7 10.2v18.2h6v5.4h-.2z" class="logo-text"></path></svg></a><button title="Open main menu" type="button" class="button action has-icon main-menu-toggle" aria-haspopup="menu" aria-label="Open main menu" aria-expanded="false"><span class="button-wrap"><span class="icon icon-menu "></span><span class="visually-hidden">Open main menu</span></span></button></div><div class="top-navigation-main"><nav class="main-nav" aria-label="Main menu"><ul class="main-menu nojs"><li class="top-level-entry-container "><button type="button" id="references-button" class="top-level-entry menu-toggle" aria-controls="references-menu" aria-expanded="false">References</button><a href="/zh-CN/docs/Web" class="top-level-entry">References</a><ul id="references-menu" class="submenu references hidden inline-submenu-lg" aria-labelledby="references-button"><li class="apis-link-container mobile-only "><a href="/zh-CN/docs/Web" class="submenu-item "><div class="submenu-icon"></div><div class="submenu-content-container"><div class="submenu-item-heading">Overview / Web Technology</div><p class="submenu-item-description">Web technology reference for developers</p></div></a></li><li class="html-link-container "><a href="/zh-CN/docs/Web/HTML" class="submenu-item "><div class="submenu-icon html"></div><div class="submenu-content-container"><div class="submenu-item-heading">HTML</div><p class="submenu-item-description">Structure of content on the web</p></div></a></li><li class="css-link-container "><a href="/zh-CN/docs/Web/CSS" class="submenu-item "><div class="submenu-icon css"></div><div class="submenu-content-container"><div class="submenu-item-heading">CSS</div><p class="submenu-item-description">Code used to describe document style</p></div></a></li><li class="javascript-link-container "><a href="/zh-CN/docs/Web/JavaScript" class="submenu-item "><div class="submenu-icon javascript"></div><div class="submenu-content-container"><div class="submenu-item-heading">JavaScript</div><p class="submenu-item-description">General-purpose scripting language</p></div></a></li><li class="http-link-container "><a href="/zh-CN/docs/Web/HTTP" class="submenu-item "><div class="submenu-icon http"></div><div class="submenu-content-container"><div class="submenu-item-heading">HTTP</div><p class="submenu-item-description">Protocol for transmitting web resources</p></div></a></li><li class="apis-link-container "><a href="/zh-CN/docs/Web/API" class="submenu-item "><div class="submenu-icon apis"></div><div class="submenu-content-container"><div class="submenu-item-heading">Web APIs</div><p class="submenu-item-description">Interfaces for building web applications</p></div></a></li><li class="apis-link-container "><a href="/zh-CN/docs/Mozilla/Add-ons/WebExtensions" class="submenu-item "><div class="submenu-icon"></div><div class="submenu-content-container"><div class="submenu-item-heading">Web Extensions</div><p class="submenu-item-description">Developing extensions for web browsers</p></div></a></li><li class=" "><a href="/zh-CN/docs/Web/Accessibility" class="submenu-item "><div class="submenu-icon"></div><div class="submenu-content-container"><div class="submenu-item-heading">Accessibility</div><p class="submenu-item-description">Build web projects usable for all</p></div></a></li><li class="apis-link-container desktop-only "><a href="/zh-CN/docs/Web" class="submenu-item "><div class="submenu-icon"></div><div class="submenu-content-container"><div class="submenu-item-heading">Web Technology</div><p class="submenu-item-description">Web technology reference for developers</p></div></a></li></ul></li><li class="top-level-entry-container "><button type="button" id="learn-button" class="top-level-entry menu-toggle" aria-controls="learn-menu" aria-expanded="false">Learn</button><a href="/zh-CN/docs/Learn_web_development" class="top-level-entry">Learn</a><ul id="learn-menu" class="submenu learn hidden inline-submenu-lg" aria-labelledby="learn-button"><li class="apis-link-container mobile-only "><a href="/zh-CN/docs/Learn_web_development" class="submenu-item "><div class="submenu-icon learn"></div><div class="submenu-content-container"><div class="submenu-item-heading">Overview / MDN Learning Area</div><p class="submenu-item-description">Learn web development</p></div></a></li><li class="apis-link-container desktop-only "><a href="/zh-CN/docs/Learn_web_development" class="submenu-item "><div class="submenu-icon learn"></div><div class="submenu-content-container"><div class="submenu-item-heading">MDN Learning Area</div><p class="submenu-item-description">Learn web development</p></div></a></li><li class="html-link-container "><a href="/zh-CN/docs/Learn_web_development/Core/Structuring_content" class="submenu-item "><div class="submenu-icon html"></div><div class="submenu-content-container"><div class="submenu-item-heading">HTML</div><p class="submenu-item-description">Learn to structure web content with HTML</p></div></a></li><li class="css-link-container "><a href="/zh-CN/docs/Learn_web_development/Core/Styling_basics" class="submenu-item "><div class="submenu-icon css"></div><div class="submenu-content-container"><div class="submenu-item-heading">CSS</div><p class="submenu-item-description">Learn to style content using CSS</p></div></a></li><li class="javascript-link-container "><a href="/zh-CN/docs/Learn_web_development/Core/Scripting" class="submenu-item "><div class="submenu-icon javascript"></div><div class="submenu-content-container"><div class="submenu-item-heading">JavaScript</div><p class="submenu-item-description">Learn to run scripts in the browser</p></div></a></li><li class=" "><a href="/zh-CN/docs/Learn_web_development/Core/Accessibility" class="submenu-item "><div class="submenu-icon"></div><div class="submenu-content-container"><div class="submenu-item-heading">Accessibility</div><p class="submenu-item-description">Learn to make the web accessible to all</p></div></a></li></ul></li><li class="top-level-entry-container "><button type="button" id="mdn-plus-button" class="top-level-entry menu-toggle" aria-controls="mdn-plus-menu" aria-expanded="false">Plus</button><a href="/zh-CN/plus" class="top-level-entry">Plus</a><ul id="mdn-plus-menu" class="submenu mdn-plus hidden inline-submenu-lg" aria-labelledby="mdn-plus-button"><li class=" "><a href="/zh-CN/plus" class="submenu-item "><div class="submenu-icon"></div><div class="submenu-content-container"><div class="submenu-item-heading">Overview</div><p class="submenu-item-description">A customized MDN experience</p></div></a></li><li class=" "><a href="/zh-CN/plus/ai-help" class="submenu-item "><div class="submenu-icon"></div><div class="submenu-content-container"><div class="submenu-item-heading">AI Help</div><p class="submenu-item-description">Get real-time assistance and support</p></div></a></li><li class=" "><a href="/zh-CN/plus/updates" class="submenu-item "><div class="submenu-icon"></div><div class="submenu-content-container"><div class="submenu-item-heading">Updates</div><p class="submenu-item-description">All browser compatibility updates at a glance</p></div></a></li><li class=" "><a href="/en-US/plus/docs/features/overview" class="submenu-item "><div class="submenu-icon"></div><div class="submenu-content-container"><div class="submenu-item-heading">Documentation</div><p class="submenu-item-description">Learn how to use MDN Plus</p></div></a></li><li class=" "><a href="/en-US/plus/docs/faq" class="submenu-item "><div class="submenu-icon"></div><div class="submenu-content-container"><div class="submenu-item-heading">FAQ</div><p class="submenu-item-description">Frequently asked questions about MDN Plus</p></div></a></li></ul></li><li class="top-level-entry-container "><a class="top-level-entry menu-link" href="/en-US/curriculum/">Curriculum <sup class="new">New</sup></a></li><li class="top-level-entry-container "><a class="top-level-entry menu-link" href="/en-US/blog/">Blog</a></li><li class="top-level-entry-container "><button type="button" id="tools-button" class="top-level-entry menu-toggle" aria-controls="tools-menu" aria-expanded="false">Tools</button><ul id="tools-menu" class="submenu tools hidden inline-submenu-lg" aria-labelledby="tools-button"><li class=" "><a href="/zh-CN/play" class="submenu-item "><div class="submenu-icon"></div><div class="submenu-content-container"><div class="submenu-item-heading">Playground</div><p class="submenu-item-description">Write, test and share your code</p></div></a></li><li class=" "><a href="/en-US/observatory" class="submenu-item "><div class="submenu-icon"></div><div class="submenu-content-container"><div class="submenu-item-heading">HTTP Observatory</div><p class="submenu-item-description">Scan a website for free</p></div></a></li><li class=" "><a href="/en-US/plus/ai-help" class="submenu-item "><div class="submenu-icon"></div><div class="submenu-content-container"><div class="submenu-item-heading">AI Help</div><p class="submenu-item-description">Get real-time assistance and support</p></div></a></li></ul></li></ul></nav><div class="header-search"><form action="/zh-CN/search" class="search-form search-widget" id="top-nav-search-form" role="search"><label id="top-nav-search-label" for="top-nav-search-input" class="visually-hidden">Search MDN</label><input aria-activedescendant="" aria-autocomplete="list" aria-controls="top-nav-search-menu" aria-expanded="false" aria-labelledby="top-nav-search-label" autoComplete="off" id="top-nav-search-input" role="combobox" type="search" class="search-input-field" name="q" placeholder=" " required="" value=""/><button type="button" class="button action has-icon clear-search-button"><span class="button-wrap"><span class="icon icon-cancel "></span><span class="visually-hidden">Clear search input</span></span></button><button type="submit" class="button action has-icon search-button"><span class="button-wrap"><span class="icon icon-search "></span><span class="visually-hidden">Search</span></span></button><div id="top-nav-search-menu" role="listbox" aria-labelledby="top-nav-search-label"></div></form></div><div class="theme-switcher-menu"><button type="button" class="button action has-icon theme-switcher-menu small" aria-haspopup="menu"><span class="button-wrap"><span class="icon icon-theme-os-default "></span>Theme</span></button></div><ul class="auth-container"><li><a href="/users/fxa/login/authenticate/?next=%2Fzh-CN%2Fdocs%2FGames%2FTechniques%2F3D_on_the_web%2FBuilding_up_a_basic_demo_with_Three.js" class="login-link" rel="nofollow">Log in</a></li><li><a href="/users/fxa/login/authenticate/?next=%2Fzh-CN%2Fdocs%2FGames%2FTechniques%2F3D_on_the_web%2FBuilding_up_a_basic_demo_with_Three.js" target="_self" rel="nofollow" class="button primary mdn-plus-subscribe-link"><span class="button-wrap">Sign up for free</span></a></li></ul></div></div></header><div class="article-actions-container"><div class="container"><button type="button" class="button action has-icon sidebar-button" aria-label="Expand sidebar" aria-expanded="false" aria-controls="sidebar-quicklinks"><span class="button-wrap"><span class="icon icon-sidebar "></span></span></button><nav class="breadcrumbs-container" aria-label="Breadcrumb"><ol typeof="BreadcrumbList" vocab="https://schema.org/" aria-label="breadcrumbs"><li property="itemListElement" typeof="ListItem"><a href="/zh-CN/docs/Games" class="breadcrumb" property="item" typeof="WebPage"><span property="name">游戏开发</span></a><meta property="position" content="1"/></li><li property="itemListElement" typeof="ListItem"><a href="/zh-CN/docs/Games/Techniques" class="breadcrumb" property="item" typeof="WebPage"><span property="name">游戏开发技术</span></a><meta property="position" content="2"/></li><li property="itemListElement" typeof="ListItem"><a href="/zh-CN/docs/Games/Techniques/3D_on_the_web" class="breadcrumb" property="item" typeof="WebPage"><span property="name">Web 中的 3D 游戏</span></a><meta property="position" content="3"/></li><li property="itemListElement" typeof="ListItem"><a href="/zh-CN/docs/Games/Techniques/3D_on_the_web/Building_up_a_basic_demo_with_Three.js" class="breadcrumb-current-page" property="item" typeof="WebPage"><span property="name">Building up a basic demo with Three.js</span></a><meta property="position" content="4"/></li></ol></nav><div class="article-actions"><button type="button" class="button action has-icon article-actions-toggle" aria-label="Article actions"><span class="button-wrap"><span class="icon icon-ellipses "></span><span class="article-actions-dialog-heading">Article Actions</span></span></button><ul class="article-actions-entries"><li class="article-actions-entry"><div class="languages-switcher-menu open-on-focus-within"><button id="languages-switcher-button" type="button" class="button action small has-icon languages-switcher-menu" aria-haspopup="menu"><span class="button-wrap"><span class="icon icon-language "></span>中文 (简体)</span></button><div class="hidden"><ul class="submenu language-menu " aria-labelledby="language-menu-button"><li class=" "><form class="submenu-item locale-redirect-setting"><div class="group"><label class="switch"><input type="checkbox" name="locale-redirect"/><span class="slider"></span><span class="label">Remember language</span></label><a href="https://github.com/orgs/mdn/discussions/739" rel="external noopener noreferrer" target="_blank" title="Enable this setting to automatically switch to this language when it's available. (Click to learn more.)"><span class="icon icon-question-mark "></span></a></div></form></li><li class=" "><a data-locale="en-US" href="/en-US/docs/Games/Techniques/3D_on_the_web/Building_up_a_basic_demo_with_Three.js" class="button submenu-item"><span>English (US)</span></a></li><li class=" "><a data-locale="de" href="/de/docs/Games/Techniques/3D_on_the_web/Building_up_a_basic_demo_with_Three.js" class="button submenu-item"><span>Deutsch</span><span title="Diese Übersetzung ist Teil eines Experiments."><span class="icon icon-experimental "></span></span></a></li><li class=" "><a data-locale="fr" href="/fr/docs/Games/Techniques/3D_on_the_web/Building_up_a_basic_demo_with_Three.js" class="button submenu-item"><span>Français</span></a></li><li class=" "><a data-locale="ja" href="/ja/docs/Games/Techniques/3D_on_the_web/Building_up_a_basic_demo_with_Three.js" class="button submenu-item"><span>日本語</span></a></li><li class=" "><a data-locale="ru" href="/ru/docs/Games/Techniques/3D_on_the_web/Building_up_a_basic_demo_with_Three.js" class="button submenu-item"><span>Русский</span></a></li></ul></div></div></li></ul></div></div></div></div><div class="container"><div class="notecard localized-content-note"><p><a href="/zh-CN/docs/MDN/Community/Contributing/Translated_content#活跃语言">此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。</a></p></div></div><div class="main-wrapper"><div class="sidebar-container"><aside id="sidebar-quicklinks" class="sidebar"><button type="button" class="button action backdrop" aria-label="Collapse sidebar"><span class="button-wrap"></span></button><nav aria-label="Related Topics" class="sidebar-inner"><header class="sidebar-actions"><section class="sidebar-filter-container"><div class="sidebar-filter "><label id="sidebar-filter-label" class="sidebar-filter-label" for="sidebar-filter-input"><span class="icon icon-filter"></span><span class="visually-hidden">Filter sidebar</span></label><input id="sidebar-filter-input" autoComplete="off" class="sidebar-filter-input-field false" type="text" placeholder="Filter" value=""/><button type="button" class="button action has-icon clear-sidebar-filter-button"><span class="button-wrap"><span class="icon icon-cancel "></span><span class="visually-hidden">Clear filter input</span></span></button></div></section></header><div class="sidebar-inner-nav"><div class="in-nav-toc"><div class="document-toc-container"><section class="document-toc"><header><h2 class="document-toc-heading">在本文中</h2></header><ul class="document-toc-list"><li class="document-toc-item "><a class="document-toc-link" href="#环境设置">环境设置</a></li><li class="document-toc-item "><a class="document-toc-link" href="#html_结构">HTML 结构</a></li><li class="document-toc-item "><a class="document-toc-link" href="#渲染器">渲染器</a></li><li class="document-toc-item "><a class="document-toc-link" href="#场景">场景</a></li><li class="document-toc-item "><a class="document-toc-link" href="#摄像机">摄像机</a></li><li class="document-toc-item "><a class="document-toc-link" href="#rendering_the_scene">Rendering the scene</a></li><li class="document-toc-item "><a class="document-toc-link" href="#geometry">Geometry</a></li><li class="document-toc-item "><a class="document-toc-link" href="#material">Material</a></li><li class="document-toc-item "><a class="document-toc-link" href="#mesh">Mesh</a></li><li class="document-toc-item "><a class="document-toc-link" href="#adding_the_cube_to_the_scene">Adding the cube to the scene</a></li><li class="document-toc-item "><a class="document-toc-link" href="#more_shapes_and_materials">More shapes and materials</a></li><li class="document-toc-item "><a class="document-toc-link" href="#lights">Lights</a></li><li class="document-toc-item "><a class="document-toc-link" href="#animation">Animation</a></li><li class="document-toc-item "><a class="document-toc-link" href="#conclusion">Conclusion</a></li></ul></section></div></div><div class="sidebar-body"><ol><li class="toggle"><details><summary>简介</summary><ol><li><a href="/zh-CN/docs/Games/Introduction">简介</a></li><li><a href="/zh-CN/docs/Games/Anatomy">剖析</a></li></ol></details></li><li class="toggle"><details><summary>游戏开发用到的 API</summary><ol><li><a href="/zh-CN/docs/Web/API/Canvas_API">Canvas</a></li><li><a href="/zh-CN/docs/Web/CSS">CSS</a></li><li><a href="/zh-CN/docs/Web/API/Fullscreen_API">全屏</a></li><li><a href="/zh-CN/docs/Web/API/Gamepad_API">游戏控制器</a></li><li><a href="/zh-CN/docs/Web/API/IndexedDB_API">IndexedDB</a></li><li><a href="/zh-CN/docs/Web/JavaScript">JavaScript</a></li><li><a href="/zh-CN/docs/Web/API/Pointer_Lock_API">指针锁定</a></li><li><a href="/zh-CN/docs/Web/SVG">SVG</a></li><li><a href="/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/TypedArray">类型数组</a></li><li><a href="/zh-CN/docs/Web/API/Web_Audio_API">Web 音频</a></li><li><a href="/zh-CN/docs/Web/API/WebGL_API">WebGL</a></li><li><a href="/zh-CN/docs/Web/API/WebRTC_API">WebRTC</a></li><li><a href="/zh-CN/docs/Web/API/WebSockets_API">WebSocket</a></li><li><a href="/zh-CN/docs/Web/API/WebVR_API">WebVR</a><abbr class="icon icon-nonstandard" title="非标准。请在使用前检查跨浏览器支持。"> <span class="visually-hidden">非标准</span> </abbr><abbr class="icon icon-deprecated" title="已弃用。请不要在新的网站中使用。"> <span class="visually-hidden">已弃用</span> </abbr></li><li><a href="/zh-CN/docs/Web/API/Web_Workers_API">Web Worker</a></li><li><a href="/zh-CN/docs/Web/API/XMLHttpRequest">XMLHttpRequest</a></li></ol></details></li><li class="toggle"><details><summary>技术</summary><ol><li><a href="/zh-CN/docs/Games/Techniques/Async_scripts">使用 asm.js 中的异步脚本</a></li><li><a href="/zh-CN/docs/Web/Performance/Optimizing_startup_performance">优化启动性能</a></li><li><a href="/en-US/docs/Games/Techniques/WebRTC_data_channels" class="only-in-en-us">使用 WebRTC 点对点数据通道</a></li><li><a href="/en-US/docs/Games/Techniques/Audio_for_Web_Games" class="only-in-en-us">Web 游戏的音频</a></li><li><a href="/zh-CN/docs/Games/Techniques/2D_collision_detection">2D 碰撞检测</a></li><li><a href="/en-US/docs/Games/Techniques/Tilemaps" class="only-in-en-us">平铺和平铺贴图概述</a></li></ol></details></li><li class="toggle"><details open=""><summary>Web 中的 3D 游戏</summary><ol><li><a href="/zh-CN/docs/Games/Techniques/3D_on_the_web">概述</a></li><li><a href="/zh-CN/docs/Games/Techniques/3D_on_the_web/Basic_theory">基本的 3D 理论</a></li><li><a href="/en-US/docs/Games/Techniques/3D_on_the_web/Building_up_a_basic_demo_with_A-Frame" class="only-in-en-us">使用 A-Frame 构建基础演示</a></li><li><a href="/en-US/docs/Games/Techniques/3D_on_the_web/Building_up_a_basic_demo_with_Babylon.js" class="only-in-en-us">使用 Babylon.js 构建基础演示</a></li><li><a href="/en-US/docs/Games/Techniques/3D_on_the_web/Building_up_a_basic_demo_with_PlayCanvas" class="only-in-en-us">使用 PlayCanvas 构建基础演示</a></li><li><em><a href="/zh-CN/docs/Games/Techniques/3D_on_the_web/Building_up_a_basic_demo_with_Three.js" aria-current="page">使用 Three.js 构建基础演示</a></em></li><li><a href="/en-US/docs/Games/Techniques/3D_on_the_web/WebXR" class="only-in-en-us">WebXR</a></li><li><a href="/zh-CN/docs/Games/Techniques/3D_collision_detection">3D 碰撞检测</a></li><li><a href="/en-US/docs/Games/Techniques/3D_collision_detection/Bounding_volume_collision_detection_with_THREE.js" class="only-in-en-us">使用 THREE.js 进行边界体积碰撞检测</a></li></ol></details></li><li class="toggle"><details><summary>实现游戏控制机制</summary><ol><li><a href="/zh-CN/docs/Games/Techniques/Control_mechanisms">控制机制</a></li><li><a href="/zh-CN/docs/Games/Techniques/Control_mechanisms/Mobile_touch">移动端触摸</a></li><li><a href="/en-US/docs/Games/Techniques/Control_mechanisms/Desktop_with_mouse_and_keyboard" class="only-in-en-us">通过鼠标和键盘控制的桌面端</a></li><li><a href="/en-US/docs/Games/Techniques/Control_mechanisms/Desktop_with_gamepad" class="only-in-en-us">通过游戏手柄控制的桌面端</a></li><li><a href="/en-US/docs/Games/Techniques/Control_mechanisms/Other" class="only-in-en-us">其他</a></li></ol></details></li><li class="toggle"><details><summary>教程</summary><ol><li><a href="/zh-CN/docs/Games/Tutorials/2D_Breakout_game_pure_JavaScript">使用纯 JavaScript 实现 2D 打砖块游戏</a></li><li><a href="/zh-CN/docs/Games/Tutorials/2D_breakout_game_Phaser">使用 Phaser 实现 2D 打砖块游戏</a></li><li><a href="/en-US/docs/Games/Tutorials/HTML5_Gamedev_Phaser_Device_Orientation" class="only-in-en-us">具有设备方向检测功能的 2D 迷宫游戏</a></li><li><a href="https://mozdevs.github.io/html5-games-workshop/en/guides/platformer/start-here/" class="external" target="_blank">使用 Phaser 实现 2D 平板游戏</a></li></ol></details></li><li class="toggle"><details><summary>发布游戏</summary><ol><li><a href="/zh-CN/docs/Games/Publishing_games">概述</a></li><li><a href="/zh-CN/docs/Games/Publishing_games/Game_distribution">游戏分发</a></li><li><a href="/zh-CN/docs/Games/Publishing_games/Game_promotion">游戏推广</a></li><li><a href="/zh-CN/docs/Games/Publishing_games/Game_monetization">游戏盈利</a></li></ol></details></li></ol></div></div><section class="place side"></section></nav></aside><div class="toc-container"><aside class="toc"><nav><div class="document-toc-container"><section class="document-toc"><header><h2 class="document-toc-heading">在本文中</h2></header><ul class="document-toc-list"><li class="document-toc-item "><a class="document-toc-link" href="#环境设置">环境设置</a></li><li class="document-toc-item "><a class="document-toc-link" href="#html_结构">HTML 结构</a></li><li class="document-toc-item "><a class="document-toc-link" href="#渲染器">渲染器</a></li><li class="document-toc-item "><a class="document-toc-link" href="#场景">场景</a></li><li class="document-toc-item "><a class="document-toc-link" href="#摄像机">摄像机</a></li><li class="document-toc-item "><a class="document-toc-link" href="#rendering_the_scene">Rendering the scene</a></li><li class="document-toc-item "><a class="document-toc-link" href="#geometry">Geometry</a></li><li class="document-toc-item "><a class="document-toc-link" href="#material">Material</a></li><li class="document-toc-item "><a class="document-toc-link" href="#mesh">Mesh</a></li><li class="document-toc-item "><a class="document-toc-link" href="#adding_the_cube_to_the_scene">Adding the cube to the scene</a></li><li class="document-toc-item "><a class="document-toc-link" href="#more_shapes_and_materials">More shapes and materials</a></li><li class="document-toc-item "><a class="document-toc-link" href="#lights">Lights</a></li><li class="document-toc-item "><a class="document-toc-link" href="#animation">Animation</a></li><li class="document-toc-item "><a class="document-toc-link" href="#conclusion">Conclusion</a></li></ul></section></div></nav></aside><section class="place side"></section></div></div><main id="content" class="main-content "><article class="main-page-content" lang="zh-CN"><header><h1>Building up a basic demo with Three.js</h1></header><div class="section-content"><p>游戏中一个典型的 3D 场景 (最简单的那种) 包含标准的物品比如在坐标轴中的形状,一个实际可看到他们的摄像机,灯光和材质让其看起来不错,动画使其生动等等。 <strong>Three.js</strong>, 和其他 3D 库一样,提供内置的 helper 函数来帮助你尽可能快地实现通用的 3D 功能 . 在这篇文章我们会带你了解使用 Three 的基本知识,包含设置开发者环境,必要的 HTML 结构,Three.js 对象基础,以及如何创建一个基本的 demo.</p> <div class="notecard note"> <p><strong>备注:</strong> 我们选择 Three.js 因为它是最流行的<a href="/zh-CN/docs/Web/API/WebGL_API">WebGL</a> 库之一,并且很容易上手。我们不会介绍任何其他更好的 WebGL 库,你可以自由选择其他库做尝试,比如 <a href="http://www.ambiera.com/copperlicht/index.html" class="external" target="_blank">CopperLicht</a>, <a href="http://www.glge.org/" class="external" target="_blank">GLGE</a>, <a href="http://osgjs.org/" class="external" target="_blank">OSG.js</a>, <a href="https://code.google.com/p/o3d/" class="external" target="_blank">O3D</a>, 或者其他你喜欢的库。</p> </div></div><section aria-labelledby="环境设置"><h2 id="环境设置"><a href="#环境设置">环境设置</a></h2><div class="section-content"><p>开始用 Three.js, 你不需要准备太多,只需:</p> <ul> <li>确保使用的支持 <a href="/zh-CN/docs/Web/API/WebGL_API">WebGL</a> 的现代浏览器,例如最新版的 Firefox 或 Chrome.</li> <li>创建一个目录保存例子。</li> <li>复制最新的压缩版 <a href="https://threejs.org/build/three.min.js" class="external" target="_blank">Three.js</a> 到你的目录。</li> <li>用单独的浏览器 tab 打开 <a href="https://threejs.org/docs/" class="external" target="_blank">Three.js</a> 文档 — 对应参考很有用。</li> </ul></div></section><section aria-labelledby="html_结构"><h2 id="html_结构"><a href="#html_结构">HTML 结构</a></h2><div class="section-content"><p>这是将用到的 HTML 结构。</p> <div class="code-example"><div class="example-header"><span class="language-name">html</span></div><pre class="brush: html notranslate"><code><!doctype html> <html> <head> meta charset="utf-8"> <title>MDN Games: Three.js demo</title> <style> body { margin: 0; padding: 0; } canvas { width: 100%; height: 100%; } </style> </head> <body> <script src="three.min.js"></script> <script> var WIDTH = window.innerWidth; var HEIGHT = window.innerHeight; /* all our JavaScript code goes here */ </script> </body> </html> </code></pre></div> <p>It contains some basic information like the document <a href="/zh-CN/docs/Web/HTML/Element/title"><code><title></code></a>, and some CSS to set the <code>width</code> and <code>height</code> of the <a href="/zh-CN/docs/Web/HTML/Element/canvas"><code><canvas></code></a> element that Three.js will insert on the page to 100% so that it will fill the entire available viewport space. The first <a href="/zh-CN/docs/Web/HTML/Element/script"><code><script></code></a> element includes the Three.js library in the page, and we will write our example code into the second one. There are two helper variables already included, which store the window's <code>width</code> and <code>height</code>.</p> <p>Before reading on, copy this code to a new text file, and save it in your working directory as <code>index.html</code>.</p></div></section><section aria-labelledby="渲染器"><h2 id="渲染器"><a href="#渲染器">渲染器</a></h2><div class="section-content"><p>A renderer is a tool that displays scenes right in your browser. There are a few different renderers: WebGL is the default one, and the others you can use are Canvas, SVG, CSS and DOM. They differ in a way everything is rendered, so the WebGL implementation will work differently than the CSS one, but the idea is to have it look exactly the same for the end user. Thanks to this approach, a fallback can be used if the primary technology is not supported by the browser.</p> <div class="code-example"><div class="example-header"><span class="language-name">js</span></div><pre class="brush: js notranslate"><code>var renderer = new THREE.WebGLRenderer({ antialias: true }); renderer.setSize(WIDTH, HEIGHT); renderer.setClearColor(0xdddddd, 1); document.body.appendChild(renderer.domElement); </code></pre></div> <p>We are creating a new WebGL renderer, setting it's size to fit the whole available space on the screen and appending the DOM structure to the page. You probably noticed the <code>antialias</code> parameter in the first line — this enables the edges of the shapes to be rendered a little more smoothly. The <code>setClearColor()</code> method sets our background to a light gray colour instead of the default black one.</p> <p>Add this code into the second <a href="/zh-CN/docs/Web/HTML/Element/script"><code><script></code></a> element, just below the JavaScript comment.</p></div></section><section aria-labelledby="场景"><h2 id="场景"><a href="#场景">场景</a></h2><div class="section-content"><p>A scene is the place where everything happens. When creating new objects in the demo, we will be adding them all to the scene to make them visible on the screen. In three.js, the scene is reperesented by a <code>Scene</code> object. Let's create it, by adding the following line below our previous lines:</p> <div class="code-example"><div class="example-header"><span class="language-name">js</span></div><pre class="brush: js notranslate"><code>var scene = new THREE.Scene(); </code></pre></div> <p>Later on we will be using the <code>.add()</code> method to add objects to the scene.</p></div></section><section aria-labelledby="摄像机"><h2 id="摄像机"><a href="#摄像机">摄像机</a></h2><div class="section-content"><p>我们有渲染场景,但是我们仍然需要一个摄像机来观察场景 - 想象没有摄像机的电影场景。下面的代码将摄像机放在三维坐标系中,并将其指向我们的场景,这样人们就能看到一些东西:</p> <div class="code-example"><div class="example-header"><span class="language-name">js</span></div><pre class="brush: js notranslate"><code>var camera = new THREE.PerspectiveCamera(70, WIDTH / HEIGHT); camera.position.z = 50; scene.add(camera); </code></pre></div> <p>Add these lines to your code, below the prevous ones.</p> <p>There are other types of camera available (Cube, Orthographic), but the simplest is the Perspective one. To initialize it we have to set its field of view and aspect ratio — the first one is used to set how much is seen, and a proper aspect ratio is important for the objects on the screen to have the right proportions when rendered and not look stretched. Let's explain the values we are setting in the code above:</p> <ul> <li>The value we set for the field of view, 70, is something we can experiment with — the higher the value, the greater the amount of scene the camera will show. Imagine a normal camera view, versus a fish eye effect, which allows a lot more to be seen. The default value is 50.</li> <li>The aspect ratio is set to the current width and height of the window so it will be dynamically adjusted. We could set a fixed ratio — for example 16 ⁄ 9, which is the aspect ratio of a widescreen TV. The default value is 1.</li> <li>The <code>z</code> position with the value of 50 units is the distance between the camera and the center of the scene on the <code>z</code> axis — here we're moving the camera back so the objects on the scene can be viewed. 50 feels ok as it's not too near and not too far and the sizes of the objects allow them to stay on the scene within the given field of view. The <code>x</code> and <code>y</code> values, if not specified, will default to 0.</li> </ul> <p>You should experiment with these values and see how they change what you see in the scene.</p> <div class="notecard note"> <p><strong>备注:</strong> The distance values (e.g. for the camera z position) are unitless, and can basically be anything you deem suitable for your scene — milimeters, meters, feet, or miles — it's up to you.</p> </div></div></section><section aria-labelledby="rendering_the_scene"><h2 id="rendering_the_scene"><a href="#rendering_the_scene">Rendering the scene</a></h2><div class="section-content"><p>Everything is ready, but we still can't see anything. Although we set the renderer up, we still have to actually render everything. Our <code>render()</code> function will do this job, with a little help from <a href="/zh-CN/docs/Web/API/Window/requestAnimationFrame"><code>requestAnimationFrame()</code></a>, which causes the scene to be re-rendered constantly on every frame:</p> <div class="code-example"><div class="example-header"><span class="language-name">js</span></div><pre class="brush: js notranslate"><code>function render() { requestAnimationFrame(render); renderer.render(scene, camera); } render(); </code></pre></div> <p>On every new frame the <code>render</code> function is invoked and the <code>renderer</code> renders the <code>scene</code> and the <code>camera</code>. Right after the function declaration we're invoking it for the first time to start the loop, after which it will be used indefinitely.</p> <p>Again add the new code below your previous additions, then try saving the file and loading it in your browser. You should now see a gray window. Congratulations!</p></div></section><section aria-labelledby="geometry"><h2 id="geometry"><a href="#geometry">Geometry</a></h2><div class="section-content"><p>Now the scene is properly rendering we can start adding 3D shapes to it. To speed up development Three.js provides a bunch of predefined primitives that you can to create shapes instantly in a single line of code. There's cubes, spheres, cylinders and more complicated shapes available. Drawing the needed vertices and faces for given shape is taken care of by the framework, so we can focus on the high level coding. Let's start by defining the geometry for a cube shape — add the following just above the <code>render()</code> function:</p> <div class="code-example"><div class="example-header"><span class="language-name">js</span></div><pre class="brush: js notranslate"><code>var boxGeometry = new THREE.BoxGeometry(10, 10, 10); </code></pre></div> <p>In this case we define a simple cube that is 10 x 10 x 10 units. The geometry itself is not enough though — we also need a material that will be used for our shape.</p></div></section><section aria-labelledby="material"><h2 id="material"><a href="#material">Material</a></h2><div class="section-content"><p>Material is that thing covering the object — the colors or texture on its surface. In our case we will use a simple blue color to paint our box. There are predefined materials that can be used: Basic, Phong, Lambert. We will play with the last two later on, but for now the Basic one should be enough:</p> <div class="code-example"><div class="example-header"><span class="language-name">js</span></div><pre class="brush: js notranslate"><code>var basicMaterial = new THREE.MeshBasicMaterial({ color: 0x0095dd }); </code></pre></div> <p>Add this line below the previous one.</p> <p>Our material is ready, but what to do next?</p></div></section><section aria-labelledby="mesh"><h2 id="mesh"><a href="#mesh">Mesh</a></h2><div class="section-content"><p>To apply the material to a geometry a mesh is used. It takes a shape and adds the specified material to every face:</p> <div class="code-example"><div class="example-header"><span class="language-name">js</span></div><pre class="brush: js notranslate"><code>var cube = new THREE.Mesh(boxGeometry, basicMaterial); </code></pre></div> <p>Again, add this line below the previous one.</p></div></section><section aria-labelledby="adding_the_cube_to_the_scene"><h2 id="adding_the_cube_to_the_scene"><a href="#adding_the_cube_to_the_scene">Adding the cube to the scene</a></h2><div class="section-content"><p>We've now created the actual cube using the geometry and material defined earlier. The last thing to do is to actually add the cube to our scene — add this line below the previous one:</p> <div class="code-example"><div class="example-header"><span class="language-name">js</span></div><pre class="brush: js notranslate"><code>scene.add(cube); </code></pre></div> <p>If you save and refresh now, your object will look like a square, because it's facing the camera. The good thing about objects is that we can move them on the scene however we want, for example rotating and scaling as we like. Let's apply a little bit of rotation to the cube, so we can see more than one face — again, add below the previous one:</p> <div class="code-example"><div class="example-header"><span class="language-name">js</span></div><pre class="brush: js notranslate"><code>cube.rotation.set(0.4, 0.2, 0); </code></pre></div> <p>Congratulations, you've created your first object in a 3D environment! It was easier than you thought, right? Here's how it should look:</p> <p><img src="/zh-CN/docs/Games/Techniques/3D_on_the_web/Building_up_a_basic_demo_with_Three.js/cube.png" alt="Blue cube on a gray background rendered with Three.js." width="600" height="400" loading="lazy"></p> <p>And here's the code we have created so far:</p> <p><iframe allowfullscreen="allowfullscreen" width="756" height="350" src="https://jsfiddle.net/end3r/bwup75fa/embedded/" loading="lazy"></iframe></p> <p>You can also <a href="https://github.com/end3r/MDN-Games-3D/blob/gh-pages/Three.js/cube.html" class="external" target="_blank">check it out on GitHub</a>.</p></div></section><section aria-labelledby="more_shapes_and_materials"><h2 id="more_shapes_and_materials"><a href="#more_shapes_and_materials">More shapes and materials</a></h2><div class="section-content"><p>Now we will add more shapes to the scene and explore other shapes, materials, lighting, and more. Let's move the cube to the left to make space for some friends — add the following line just below the previous one:</p> <div class="code-example"><div class="example-header"><span class="language-name">js</span></div><pre class="brush: js notranslate"><code>cube.position.x = -25; </code></pre></div> <p>Now onto the shapes and materials: what would you say for a torus using the Phong material? Try adding the following lines just below the lines that define the cube.</p> <div class="code-example"><div class="example-header"><span class="language-name">js</span></div><pre class="brush: js notranslate"><code>var torusGeometry = new THREE.TorusGeometry(7, 1, 6, 12); var phongMaterial = new THREE.MeshPhongMaterial({ color: 0xff9500 }); var torus = new THREE.Mesh(torusGeometry, phongMaterial); scene.add(torus); </code></pre></div> <p>Thee lines will add a torus geometry; the <code>TorusGeometry()</code> method's parameters define and the parameters are <code>radius</code>, <code>tube diameter</code>, <code>radial segment count</code> and <code>tubular segment count</code>. The Phong material should look more glossy than the simple color of the box that was using the Basic material, although at the moment it will just look black.</p> <p>We can have even crazier predefined shapes; let's play some more — add the following lines below the ones that defined the torus:</p> <div class="code-example"><div class="example-header"><span class="language-name">js</span></div><pre class="brush: js notranslate"><code>var dodecahedronGeometry = new THREE.DodecahedronGeometry(7); var lambertMaterial = new THREE.MeshLambertMaterial({ color: 0xeaeff2 }); var dodecahedron = new THREE.Mesh(dodecahedronGeometry, lambertMaterial); dodecahedron.position.x = 25; scene.add(dodecahedron); </code></pre></div> <p>This time we are creating a dodecahedron, which is a shape containing twelve flat faces. The parameter <code>DodecahedronGeometry()</code> takes is the size of the object. We're using a Lambert material here, which is similar to Phong, but should be less glossy (again, black for now.) We're moving the object to the right, so it's not in the same place as the box or torus.</p> <p>As mentioned above, the new objects currently just look black. To have both the Phong and Lambert materials properly visible we need a source of light.</p></div></section><section aria-labelledby="lights"><h2 id="lights"><a href="#lights">Lights</a></h2><div class="section-content"><p>There are various types of light sources available in Three.js; the most basic one is the <code>PointLight</code>, which works like a flashlight — shinig a spotlight in a given direction. Add the following below your shapre definitions:</p> <div class="code-example"><div class="example-header"><span class="language-name">js</span></div><pre class="brush: js notranslate"><code>var light = new THREE.PointLight(0xffffff); light.position.set(-10, 15, 50); scene.add(light); </code></pre></div> <p>We define a white point of light, set it's position a bit away from the center of the scene so it can light up some parts of the shapes, and add it to the scene. Now everything works as it should — all three shapes are visible. You should check the documentation for other types of light like Ambient, Directional, Hemisphere or Spot, and experiment with placing them on the scene to see the effects.</p> <p><img src="/zh-CN/docs/Games/Techniques/3D_on_the_web/Building_up_a_basic_demo_with_Three.js/shapes.png" alt="Shapes: blue cube, dark yellow torus and dark gray dodecahedron on a gray background rendered with Three.js." width="600" height="400" loading="lazy"></p> <p>This looks a little bit boring though. In a game something is usually happening — we can see animations and such — so let's try to breathe a little life into those shapes by animating them.</p></div></section><section aria-labelledby="animation"><h2 id="animation"><a href="#animation">Animation</a></h2><div class="section-content"><p>We already used rotation to adjust the position of the cube; we could also scale the shapes, or change thier positions. To show actual animation, we need to make changes to these values inside the render loop so, they are updated on every frame.</p></div></section><section aria-labelledby="rotation"><h3 id="rotation"><a href="#rotation">Rotation</a></h3><div class="section-content"><p>Rotating is quite easy — all you need to do is to add a defined value to the given direction of the rotation on each frame. Add this line of code right after the <code>requestAnimationFrame()</code> invocation in the <code>render</code> function:</p> <div class="code-example"><div class="example-header"><span class="language-name">js</span></div><pre class="brush: js notranslate"><code>cube.rotation.y += 0.01; </code></pre></div> <p>It will rotate the cube on every frame by a tiny bit, so it will look like a smooth animation.</p></div></section><section aria-labelledby="scaling"><h3 id="scaling"><a href="#scaling">Scaling</a></h3><div class="section-content"><p>We can also scale a given object. By applying a constant value we could make it grow or shrink once, but let's make it more interesting. First, we will need a helper variable called <code>t</code> for counting the elapsed time. Add it right before the <code>render()</code> function:</p> <div class="code-example"><div class="example-header"><span class="language-name">js</span></div><pre class="brush: js notranslate"><code>var t = 0; </code></pre></div> <p>Now let's increase the value by a given constant value on each frame of the animation; add the following lines just below the <code>requestAnimationFrame()</code> invocation:</p> <div class="code-example"><div class="example-header"><span class="language-name">js</span></div><pre class="brush: js notranslate"><code>t += 0.01; torus.scale.y = Math.abs(Math.sin(t)); </code></pre></div> <p>This way we'll be able to use <code>Math.sin</code> and end up with quite an interesting result: this will scale the torus and repeat the whole process, as <code>sin</code> is a periodic function. We're wrapping the scale value in <code>Math.abs</code> to pass the absolute values (greater or equal to 0), because sin is between -1 and 0, and for negative values the torus might render unexpectedly (in this case it looks black half the time.)</p> <p>Now onto the movement part.</p></div></section><section aria-labelledby="moving"><h3 id="moving"><a href="#moving">Moving</a></h3><div class="section-content"><p>Beside rotation and scaling we can also move objects around the scene. Add the following, again just below the <code>requestAnimationFrame()</code> invocation:</p> <div class="code-example"><div class="example-header"><span class="language-name">js</span></div><pre class="brush: js notranslate"><code>dodecahedron.position.y = -7 * Math.sin(t * 2); </code></pre></div> <p>This will move the dodecahedron up and down by applying the <code>sin()</code> value to the y axis on each frame, with a little bit of adjustment to make it look cooler. Try changing the values to see how it affects the animations.</p></div></section><section aria-labelledby="conclusion"><h2 id="conclusion"><a href="#conclusion">Conclusion</a></h2><div class="section-content"><p>Here's the final piece of the code:</p> <p><iframe allowfullscreen="allowfullscreen" width="756" height="350" src="https://jsfiddle.net/rybr720u/embedded/" loading="lazy"></iframe></p> <p>You can also <a href="https://github.com/end3r/MDN-Games-3D/blob/gh-pages/Three.js/shapes.html" class="external" target="_blank">see it on GitHub</a> and <a href="https://github.com/end3r/MDN-Games-3D/" class="external" target="_blank">fork the repository</a> if you want to play with it yourself locally. Now you know the basics of Three.js, you can get back to the parent page about <a href="/zh-CN/docs/Games/Techniques/3D_on_the_web">3D on the Web</a>.</p> <p>You should also try learning raw WebGL, so you can get a better understanding of what's going on. See our <a href="/zh-CN/docs/Web/API/WebGL_API">WebGL documentation</a>.</p></div></section></article><aside class="article-footer"><div class="article-footer-inner"><div class="svg-container"><svg xmlns="http://www.w3.org/2000/svg" width="162" height="162" viewBox="0 0 162 162" fill="none" role="none"><mask id="b" fill="#fff"><path d="M97.203 47.04c8.113-7.886 18.004-13.871 28.906-17.492a78 78 0 0 1 33.969-3.39c11.443 1.39 22.401 5.295 32.024 11.411s17.656 14.28 23.476 23.86c5.819 9.579 9.269 20.318 10.083 31.385a69.85 69.85 0 0 1-5.387 32.44c-4.358 10.272-11.115 19.443-19.747 26.801-8.632 7.359-18.908 12.709-30.034 15.637l-6.17-21.698c7.666-2.017 14.746-5.703 20.694-10.773 5.948-5.071 10.603-11.389 13.606-18.467a48.14 48.14 0 0 0 3.712-22.352c-.561-7.625-2.938-15.025-6.948-21.625s-9.544-12.226-16.175-16.44-14.181-6.904-22.065-7.863a53.75 53.75 0 0 0-23.405 2.336c-7.513 2.495-14.327 6.62-19.918 12.053z"></path></mask><path stroke="url(#a)" stroke-dasharray="6, 6" stroke-width="2" d="M97.203 47.04c8.113-7.886 18.004-13.871 28.906-17.492a78 78 0 0 1 33.969-3.39c11.443 1.39 22.401 5.295 32.024 11.411s17.656 14.28 23.476 23.86c5.819 9.579 9.269 20.318 10.083 31.385a69.85 69.85 0 0 1-5.387 32.44c-4.358 10.272-11.115 19.443-19.747 26.801-8.632 7.359-18.908 12.709-30.034 15.637l-6.17-21.698c7.666-2.017 14.746-5.703 20.694-10.773 5.948-5.071 10.603-11.389 13.606-18.467a48.14 48.14 0 0 0 3.712-22.352c-.561-7.625-2.938-15.025-6.948-21.625s-9.544-12.226-16.175-16.44-14.181-6.904-22.065-7.863a53.75 53.75 0 0 0-23.405 2.336c-7.513 2.495-14.327 6.62-19.918 12.053z" mask="url(#b)" style="stroke:url(#a)" transform="translate(-63.992 -25.587)"></path><ellipse cx="8.066" cy="111.597" fill="var(--background-tertiary)" rx="53.677" ry="53.699" transform="matrix(.71707 -.697 .7243 .6895 0 0)"></ellipse><g clip-path="url(#c)" transform="translate(-63.992 -25.587)"><path fill="#9abff5" d="m144.256 137.379 32.906 12.434a4.41 4.41 0 0 1 2.559 5.667l-9.326 24.679a4.41 4.41 0 0 1-5.667 2.559l-8.226-3.108-2.332 6.17c-.466 1.233-.375 1.883-1.609 1.417l-2.253-.527c-.411-.155-.95-.594-1.206-1.161l-4.734-10.484-12.545-4.741a4.41 4.41 0 0 1-2.559-5.667l9.325-24.679a4.41 4.41 0 0 1 5.667-2.559m9.961 29.617 8.227 3.108 3.264-8.638-.498-6.768-4.113-1.555.548 7.258-4.319-1.632zm-12.339-4.663 8.226 3.108 3.264-8.637-.498-6.769-4.113-1.554.548 7.257-4.319-1.632z"></path></g><g clip-path="url(#d)" transform="translate(-63.992 -25.587)"><path fill="#81b0f3" d="M135.35 60.136 86.67 41.654c-3.346-1.27-7.124.428-8.394 3.775L64.414 81.938c-1.27 3.347.428 7.125 3.774 8.395l12.17 4.62-3.465 9.128c-.693 1.826-1.432 2.457.394 3.15l3.014 1.625c.609.231 1.637.274 2.477-.104l15.53-6.983 18.56 7.047c3.346 1.27 7.124-.428 8.395-3.775l13.862-36.51c1.27-3.346-.428-7.124-3.775-8.395M95.261 83.207l-12.17-4.62 4.852-12.779 7.19-7.017 6.085 2.31-7.725 7.51 6.389 2.426zm18.255 6.93-12.17-4.62 4.852-12.778 7.189-7.017 6.085 2.31-7.725 7.51 6.39 2.426z"></path></g><defs><clipPath id="c"><path fill="#fff" d="m198.638 146.586-65.056-24.583-24.583 65.057 65.056 24.582z"></path></clipPath><clipPath id="d"><path fill="#fff" d="m66.438 14.055 96.242 36.54-36.54 96.243-96.243-36.54z"></path></clipPath><linearGradient id="a" x1="97.203" x2="199.995" y1="47.04" y2="152.793" gradientUnits="userSpaceOnUse"><stop stop-color="#086DFC"></stop><stop offset="0.246" stop-color="#2C81FA"></stop><stop offset="0.516" stop-color="#5497F8"></stop><stop offset="0.821" stop-color="#80B0F6"></stop><stop offset="1" stop-color="#9ABFF5"></stop></linearGradient></defs></svg></div><h2>Help improve MDN</h2><fieldset class="feedback"><label>Was this page helpful to you?</label><div class="button-container"><button type="button" class="button primary has-icon yes"><span class="button-wrap"><span class="icon icon-thumbs-up "></span>Yes</span></button><button type="button" class="button primary has-icon no"><span class="button-wrap"><span class="icon icon-thumbs-down "></span>No</span></button></div></fieldset><a class="contribute" href="https://github.com/mdn/translated-content/blob/main/CONTRIBUTING.md" title="This will take you to our contribution guidelines on GitHub." target="_blank" rel="noopener noreferrer">Learn how to contribute</a>.<p class="last-modified-date">This page was last modified on<!-- --> <time dateTime="2024-12-13T12:17:17.000Z">2024年12月13日</time> by<!-- --> <a href="/zh-CN/docs/Games/Techniques/3D_on_the_web/Building_up_a_basic_demo_with_Three.js/contributors.txt" rel="nofollow">MDN contributors</a>.</p><div id="on-github" class="on-github"><a href="https://github.com/mdn/translated-content/blob/main/files/zh-cn/games/techniques/3d_on_the_web/building_up_a_basic_demo_with_three.js/index.md?plain=1" title="Folder: zh-cn/games/techniques/3d_on_the_web/building_up_a_basic_demo_with_three.js (Opens in a new tab)" target="_blank" rel="noopener noreferrer">View this page on GitHub</a> <!-- -->•<!-- --> <a href="https://github.com/mdn/translated-content/issues/new?template=page-report-zh-cn.yml&mdn-url=https%3A%2F%2Fdeveloper.mozilla.org%2Fzh-CN%2Fdocs%2FGames%2FTechniques%2F3D_on_the_web%2FBuilding_up_a_basic_demo_with_Three.js&metadata=%3C%21--+Do+not+make+changes+below+this+line+--%3E%0A%3Cdetails%3E%0A%3Csummary%3EPage+report+details%3C%2Fsummary%3E%0A%0A*+Folder%3A+%60zh-cn%2Fgames%2Ftechniques%2F3d_on_the_web%2Fbuilding_up_a_basic_demo_with_three.js%60%0A*+MDN+URL%3A+https%3A%2F%2Fdeveloper.mozilla.org%2Fzh-CN%2Fdocs%2FGames%2FTechniques%2F3D_on_the_web%2FBuilding_up_a_basic_demo_with_Three.js%0A*+GitHub+URL%3A+https%3A%2F%2Fgithub.com%2Fmdn%2Ftranslated-content%2Fblob%2Fmain%2Ffiles%2Fzh-cn%2Fgames%2Ftechniques%2F3d_on_the_web%2Fbuilding_up_a_basic_demo_with_three.js%2Findex.md%0A*+Last+commit%3A+https%3A%2F%2Fgithub.com%2Fmdn%2Ftranslated-content%2Fcommit%2Fdc6649b90bdfe093ee121d7936a1edf8455c51bc%0A*+Document+last+modified%3A+2024-12-13T12%3A17%3A17.000Z%0A%0A%3C%2Fdetails%3E" title="This will take you to GitHub to file a new issue." target="_blank" rel="noopener noreferrer">Report a problem with this content</a></div></div></aside></main></div></div><footer id="nav-footer" class="page-footer"><div class="page-footer-grid"><div class="page-footer-logo-col"><a href="/" class="mdn-footer-logo" aria-label="MDN homepage"><svg width="48" height="17" viewBox="0 0 48 17" fill="none" xmlns="http://www.w3.org/2000/svg"><title id="mdn-footer-logo-svg">MDN logo</title><path d="M20.04 16.512H15.504V10.416C15.504 9.488 15.344 8.824 15.024 8.424C14.72 8.024 14.264 7.824 13.656 7.824C12.92 7.824 12.384 8.064 12.048 8.544C11.728 9.024 11.568 9.64 11.568 10.392V14.184H13.008V16.512H8.472V10.416C8.472 9.488 8.312 8.824 7.992 8.424C7.688 8.024 7.232 7.824 6.624 7.824C5.872 7.824 5.336 8.064 5.016 8.544C4.696 9.024 4.536 9.64 4.536 10.392V14.184H6.6V16.512H0V14.184H1.44V8.04H0.024V5.688H4.536V7.32C5.224 6.088 6.32 5.472 7.824 5.472C8.608 5.472 9.328 5.664 9.984 6.048C10.64 6.432 11.096 7.016 11.352 7.8C11.992 6.248 13.168 5.472 14.88 5.472C15.856 5.472 16.72 5.776 17.472 6.384C18.224 6.992 18.6 7.936 18.6 9.216V14.184H20.04V16.512Z" fill="currentColor"></path><path d="M33.6714 16.512H29.1354V14.496C28.8314 15.12 28.3834 15.656 27.7914 16.104C27.1994 16.536 26.4154 16.752 25.4394 16.752C24.0154 16.752 22.8954 16.264 22.0794 15.288C21.2634 14.312 20.8554 12.984 20.8554 11.304C20.8554 9.688 21.2554 8.312 22.0554 7.176C22.8554 6.04 24.0634 5.472 25.6794 5.472C26.5594 5.472 27.2794 5.648 27.8394 6C28.3994 6.352 28.8314 6.8 29.1354 7.344V2.352H26.9754V0H32.2314V14.184H33.6714V16.512ZM29.1354 11.04V10.776C29.1354 9.88 28.8954 9.184 28.4154 8.688C27.9514 8.176 27.3674 7.92 26.6634 7.92C25.9754 7.92 25.3674 8.176 24.8394 8.688C24.3274 9.2 24.0714 10.008 24.0714 11.112C24.0714 12.152 24.3114 12.944 24.7914 13.488C25.2714 14.032 25.8394 14.304 26.4954 14.304C27.3114 14.304 27.9514 13.96 28.4154 13.272C28.8954 12.584 29.1354 11.84 29.1354 11.04Z" fill="currentColor"></path><path d="M47.9589 16.512H41.9829V14.184H43.4229V10.416C43.4229 9.488 43.2629 8.824 42.9429 8.424C42.6389 8.024 42.1829 7.824 41.5749 7.824C40.8389 7.824 40.2709 8.056 39.8709 8.52C39.4709 8.968 39.2629 9.56 39.2469 10.296V14.184H40.6869V16.512H34.7109V14.184H36.1509V8.04H34.5909V5.688H39.2469V7.344C39.9669 6.096 41.1269 5.472 42.7269 5.472C43.7509 5.472 44.6389 5.776 45.3909 6.384C46.1429 6.992 46.5189 7.936 46.5189 9.216V14.184H47.9589V16.512Z" fill="currentColor"></path></svg></a><p>Your blueprint for a better internet.</p><ul class="social-icons"><li><a href="https://mastodon.social/@mdn" target="_blank" rel="me noopener noreferrer"><span class="icon icon-mastodon"></span><span class="visually-hidden">MDN on Mastodon</span></a></li><li><a href="https://twitter.com/mozdevnet" target="_blank" rel="noopener noreferrer"><span class="icon icon-twitter-x"></span><span class="visually-hidden">MDN on X (formerly Twitter)</span></a></li><li><a href="https://github.com/mdn/" target="_blank" rel="noopener noreferrer"><span class="icon icon-github-mark-small"></span><span class="visually-hidden">MDN on GitHub</span></a></li><li><a href="/en-US/blog/rss.xml" target="_blank"><span class="icon icon-feed"></span><span class="visually-hidden">MDN Blog RSS Feed</span></a></li></ul></div><div class="page-footer-nav-col-1"><h2 class="footer-nav-heading">MDN</h2><ul class="footer-nav-list"><li class="footer-nav-item"><a href="/en-US/about">About</a></li><li class="footer-nav-item"><a href="/en-US/blog/">Blog</a></li><li class="footer-nav-item"><a href="https://www.mozilla.org/en-US/careers/listings/?team=ProdOps" target="_blank" rel="noopener noreferrer">Careers</a></li><li class="footer-nav-item"><a href="/en-US/advertising">Advertise with us</a></li></ul></div><div class="page-footer-nav-col-2"><h2 class="footer-nav-heading">Support</h2><ul class="footer-nav-list"><li class="footer-nav-item"><a class="footer-nav-link" href="https://support.mozilla.org/products/mdn-plus">Product help</a></li><li class="footer-nav-item"><a class="footer-nav-link" href="/zh-CN/docs/MDN/Community/Issues">Report an issue</a></li></ul></div><div class="page-footer-nav-col-3"><h2 class="footer-nav-heading">Our communities</h2><ul class="footer-nav-list"><li class="footer-nav-item"><a class="footer-nav-link" href="/en-US/community">MDN Community</a></li><li class="footer-nav-item"><a class="footer-nav-link" href="https://discourse.mozilla.org/c/mdn/236" target="_blank" rel="noopener noreferrer">MDN Forum</a></li><li class="footer-nav-item"><a class="footer-nav-link" href="/discord" target="_blank" rel="noopener noreferrer">MDN Chat</a></li></ul></div><div class="page-footer-nav-col-4"><h2 class="footer-nav-heading">Developers</h2><ul class="footer-nav-list"><li class="footer-nav-item"><a class="footer-nav-link" href="/zh-CN/docs/Web">Web Technologies</a></li><li class="footer-nav-item"><a class="footer-nav-link" href="/zh-CN/docs/Learn">Learn Web Development</a></li><li class="footer-nav-item"><a class="footer-nav-link" href="/zh-CN/plus">MDN Plus</a></li><li class="footer-nav-item"><a href="https://hacks.mozilla.org/" target="_blank" rel="noopener noreferrer">Hacks Blog</a></li></ul></div><div class="page-footer-moz"><a href="https://www.mozilla.org/" class="footer-moz-logo-link" target="_blank" rel="noopener noreferrer"><svg xmlns="http://www.w3.org/2000/svg" width="137" height="32" fill="none" viewBox="0 0 267.431 62.607"><path fill="currentColor" d="m13.913 23.056 5.33 25.356h2.195l5.33-25.356h14.267v38.976h-7.578V29.694h-2.194l-7.264 32.337h-7.343L9.418 29.694H7.223v32.337H-.354V23.056Zm47.137 9.123c9.12 0 14.423 5.385 14.423 15.214s-5.33 15.214-14.423 15.214c-9.12 0-14.423-5.385-14.423-15.214 0-9.855 5.304-15.214 14.423-15.214m0 24.363c4.285 0 6.428-2.196 6.428-7.032v-4.287c0-4.836-2.143-7.032-6.428-7.032s-6.428 2.196-6.428 7.032v4.287c0 4.836 2.143 7.032 6.428 7.032m18.473-.157 15.47-18.01h-15.26v-5.647h24.352v5.646L88.616 56.385h15.704v5.646H79.523Zm29.318-23.657h11.183V62.03h-7.578V38.375h-3.632v-5.646zm3.605-9.672h7.578v5.646h-7.578zm13.17 0h11.21v38.976h-7.578v-33.33h-3.632zm16.801 0H153.6v38.976h-7.577v-33.33h-3.632v-5.646zm29.03 9.123c4.442 0 7.394 2.143 8.231 5.881h2.194v-5.332h9.276v5.646h-3.632v18.011h3.632v5.646h-4.442c-3.135 0-4.834-1.699-4.834-4.836V56.7h-2.194c-.81 3.738-3.789 5.881-8.23 5.881-6.978 0-11.916-5.829-11.916-15.214 0-9.384 4.938-15.187 11.915-15.187m2.3 24.363c4.284 0 6.192-2.196 6.192-7.032v-4.287c0-4.836-1.908-7.032-6.193-7.032-4.18 0-6.193 2.196-6.193 7.032v4.287c0 4.836 2.012 7.032 6.193 7.032m48.34 5.489h-7.577V0h7.577zm6.585-29.643h32.165v-2.196l-21.295-7.634v-6.143l21.295-7.633V6.588h-25.345V0h32.165v12.522l-17.35 5.881V20.6l17.35 5.882v12.521h-38.985zm0-25.801h6.794v6.796h-6.794z"></path></svg></a><ul class="footer-moz-list"><li class="footer-moz-item"><a href="https://www.mozilla.org/privacy/websites/" class="footer-moz-link" target="_blank" rel="noopener noreferrer">Website Privacy Notice</a></li><li class="footer-moz-item"><a href="https://www.mozilla.org/privacy/websites/#cookies" class="footer-moz-link" target="_blank" rel="noopener noreferrer">Cookies</a></li><li class="footer-moz-item"><a href="https://www.mozilla.org/about/legal/terms/mozilla" class="footer-moz-link" target="_blank" rel="noopener noreferrer">Legal</a></li><li class="footer-moz-item"><a href="https://www.mozilla.org/about/governance/policies/participation/" class="footer-moz-link" target="_blank" rel="noopener noreferrer">Community Participation Guidelines</a></li></ul></div><div class="page-footer-legal"><p id="license" class="page-footer-legal-text">Visit<!-- --> <a href="https://www.mozilla.org" target="_blank" rel="noopener noreferrer">Mozilla Corporation’s</a> <!-- -->not-for-profit parent, the<!-- --> <a target="_blank" rel="noopener noreferrer" href="https://foundation.mozilla.org/">Mozilla Foundation</a>.<br/>Portions of this content are ©1998–<!-- -->2025<!-- --> by individual mozilla.org contributors. Content available under<!-- --> <a href="/zh-CN/docs/MDN/Writing_guidelines/Attrib_copyright_license">a Creative Commons license</a>.</p></div></div></footer></div><script type="application/json" id="hydration">{"url":"/zh-CN/docs/Games/Techniques/3D_on_the_web/Building_up_a_basic_demo_with_Three.js","doc":{"body":[{"type":"prose","value":{"id":null,"title":null,"isH3":false,"content":"<p>游戏中一个典型的 3D 场景 (最简单的那种) 包含标准的物品比如在坐标轴中的形状,一个实际可看到他们的摄像机,灯光和材质让其看起来不错,动画使其生动等等。 <strong>Three.js</strong>, 和其他 3D 库一样,提供内置的 helper 函数来帮助你尽可能快地实现通用的 3D 功能 . 在这篇文章我们会带你了解使用 Three 的基本知识,包含设置开发者环境,必要的 HTML 结构,Three.js 对象基础,以及如何创建一个基本的 demo.</p>\n<div class=\"notecard note\">\n<p><strong>备注:</strong>\n我们选择 Three.js 因为它是最流行的<a href=\"/zh-CN/docs/Web/API/WebGL_API\">WebGL</a> 库之一,并且很容易上手。我们不会介绍任何其他更好的 WebGL 库,你可以自由选择其他库做尝试,比如 <a href=\"http://www.ambiera.com/copperlicht/index.html\" class=\"external\" target=\"_blank\">CopperLicht</a>, <a href=\"http://www.glge.org/\" class=\"external\" target=\"_blank\">GLGE</a>, <a href=\"http://osgjs.org/\" class=\"external\" target=\"_blank\">OSG.js</a>, <a href=\"https://code.google.com/p/o3d/\" class=\"external\" target=\"_blank\">O3D</a>, 或者其他你喜欢的库。</p>\n</div>"}},{"type":"prose","value":{"id":"环境设置","title":"环境设置","isH3":false,"content":"<p>开始用 Three.js, 你不需要准备太多,只需:</p>\n<ul>\n<li>确保使用的支持 <a href=\"/zh-CN/docs/Web/API/WebGL_API\">WebGL</a> 的现代浏览器,例如最新版的 Firefox 或 Chrome.</li>\n<li>创建一个目录保存例子。</li>\n<li>复制最新的压缩版 <a href=\"https://threejs.org/build/three.min.js\" class=\"external\" target=\"_blank\">Three.js</a> 到你的目录。</li>\n<li>用单独的浏览器 tab 打开 <a href=\"https://threejs.org/docs/\" class=\"external\" target=\"_blank\">Three.js</a> 文档 — 对应参考很有用。</li>\n</ul>"}},{"type":"prose","value":{"id":"html_结构","title":"HTML 结构","isH3":false,"content":"<p>这是将用到的 HTML 结构。</p>\n<div class=\"code-example\"><div class=\"example-header\"><span class=\"language-name\">html</span></div><pre class=\"brush: html notranslate\"><code><!doctype html>\n<html>\n <head>\n meta charset=\"utf-8\">\n <title>MDN Games: Three.js demo</title>\n <style>\n body {\n margin: 0;\n padding: 0;\n }\n canvas {\n width: 100%;\n height: 100%;\n }\n </style>\n </head>\n <body>\n <script src=\"three.min.js\"></script>\n <script>\n var WIDTH = window.innerWidth;\n var HEIGHT = window.innerHeight;\n /* all our JavaScript code goes here */\n </script>\n </body>\n</html>\n</code></pre></div>\n<p>It contains some basic information like the document <a href=\"/zh-CN/docs/Web/HTML/Element/title\"><code><title></code></a>, and some CSS to set the <code>width</code> and <code>height</code> of the <a href=\"/zh-CN/docs/Web/HTML/Element/canvas\"><code><canvas></code></a> element that Three.js will insert on the page to 100% so that it will fill the entire available viewport space. The first <a href=\"/zh-CN/docs/Web/HTML/Element/script\"><code><script></code></a> element includes the Three.js library in the page, and we will write our example code into the second one. There are two helper variables already included, which store the window's <code>width</code> and <code>height</code>.</p>\n<p>Before reading on, copy this code to a new text file, and save it in your working directory as <code>index.html</code>.</p>"}},{"type":"prose","value":{"id":"渲染器","title":"渲染器","isH3":false,"content":"<p>A renderer is a tool that displays scenes right in your browser. There are a few different renderers: WebGL is the default one, and the others you can use are Canvas, SVG, CSS and DOM. They differ in a way everything is rendered, so the WebGL implementation will work differently than the CSS one, but the idea is to have it look exactly the same for the end user. Thanks to this approach, a fallback can be used if the primary technology is not supported by the browser.</p>\n<div class=\"code-example\"><div class=\"example-header\"><span class=\"language-name\">js</span></div><pre class=\"brush: js notranslate\"><code>var renderer = new THREE.WebGLRenderer({ antialias: true });\nrenderer.setSize(WIDTH, HEIGHT);\nrenderer.setClearColor(0xdddddd, 1);\ndocument.body.appendChild(renderer.domElement);\n</code></pre></div>\n<p>We are creating a new WebGL renderer, setting it's size to fit the whole available space on the screen and appending the DOM structure to the page. You probably noticed the <code>antialias</code> parameter in the first line — this enables the edges of the shapes to be rendered a little more smoothly. The <code>setClearColor()</code> method sets our background to a light gray colour instead of the default black one.</p>\n<p>Add this code into the second <a href=\"/zh-CN/docs/Web/HTML/Element/script\"><code><script></code></a> element, just below the JavaScript comment.</p>"}},{"type":"prose","value":{"id":"场景","title":"场景","isH3":false,"content":"<p>A scene is the place where everything happens. When creating new objects in the demo, we will be adding them all to the scene to make them visible on the screen. In three.js, the scene is reperesented by a <code>Scene</code> object. Let's create it, by adding the following line below our previous lines:</p>\n<div class=\"code-example\"><div class=\"example-header\"><span class=\"language-name\">js</span></div><pre class=\"brush: js notranslate\"><code>var scene = new THREE.Scene();\n</code></pre></div>\n<p>Later on we will be using the <code>.add()</code> method to add objects to the scene.</p>"}},{"type":"prose","value":{"id":"摄像机","title":"摄像机","isH3":false,"content":"<p>我们有渲染场景,但是我们仍然需要一个摄像机来观察场景 - 想象没有摄像机的电影场景。下面的代码将摄像机放在三维坐标系中,并将其指向我们的场景,这样人们就能看到一些东西:</p>\n<div class=\"code-example\"><div class=\"example-header\"><span class=\"language-name\">js</span></div><pre class=\"brush: js notranslate\"><code>var camera = new THREE.PerspectiveCamera(70, WIDTH / HEIGHT);\ncamera.position.z = 50;\nscene.add(camera);\n</code></pre></div>\n<p>Add these lines to your code, below the prevous ones.</p>\n<p>There are other types of camera available (Cube, Orthographic), but the simplest is the Perspective one. To initialize it we have to set its field of view and aspect ratio — the first one is used to set how much is seen, and a proper aspect ratio is important for the objects on the screen to have the right proportions when rendered and not look stretched. Let's explain the values we are setting in the code above:</p>\n<ul>\n<li>The value we set for the field of view, 70, is something we can experiment with — the higher the value, the greater the amount of scene the camera will show. Imagine a normal camera view, versus a fish eye effect, which allows a lot more to be seen. The default value is 50.</li>\n<li>The aspect ratio is set to the current width and height of the window so it will be dynamically adjusted. We could set a fixed ratio — for example 16 ⁄ 9, which is the aspect ratio of a widescreen TV. The default value is 1.</li>\n<li>The <code>z</code> position with the value of 50 units is the distance between the camera and the center of the scene on the <code>z</code> axis — here we're moving the camera back so the objects on the scene can be viewed. 50 feels ok as it's not too near and not too far and the sizes of the objects allow them to stay on the scene within the given field of view. The <code>x</code> and <code>y</code> values, if not specified, will default to 0.</li>\n</ul>\n<p>You should experiment with these values and see how they change what you see in the scene.</p>\n<div class=\"notecard note\">\n<p><strong>备注:</strong>\nThe distance values (e.g. for the camera z position) are unitless, and can basically be anything you deem suitable for your scene — milimeters, meters, feet, or miles — it's up to you.</p>\n</div>"}},{"type":"prose","value":{"id":"rendering_the_scene","title":"Rendering the scene","isH3":false,"content":"<p>Everything is ready, but we still can't see anything. Although we set the renderer up, we still have to actually render everything. Our <code>render()</code> function will do this job, with a little help from <a href=\"/zh-CN/docs/Web/API/Window/requestAnimationFrame\"><code>requestAnimationFrame()</code></a>, which causes the scene to be re-rendered constantly on every frame:</p>\n<div class=\"code-example\"><div class=\"example-header\"><span class=\"language-name\">js</span></div><pre class=\"brush: js notranslate\"><code>function render() {\n requestAnimationFrame(render);\n renderer.render(scene, camera);\n}\nrender();\n</code></pre></div>\n<p>On every new frame the <code>render</code> function is invoked and the <code>renderer</code> renders the <code>scene</code> and the <code>camera</code>. Right after the function declaration we're invoking it for the first time to start the loop, after which it will be used indefinitely.</p>\n<p>Again add the new code below your previous additions, then try saving the file and loading it in your browser. You should now see a gray window. Congratulations!</p>"}},{"type":"prose","value":{"id":"geometry","title":"Geometry","isH3":false,"content":"<p>Now the scene is properly rendering we can start adding 3D shapes to it. To speed up development Three.js provides a bunch of predefined primitives that you can to create shapes instantly in a single line of code. There's cubes, spheres, cylinders and more complicated shapes available. Drawing the needed vertices and faces for given shape is taken care of by the framework, so we can focus on the high level coding. Let's start by defining the geometry for a cube shape — add the following just above the <code>render()</code> function:</p>\n<div class=\"code-example\"><div class=\"example-header\"><span class=\"language-name\">js</span></div><pre class=\"brush: js notranslate\"><code>var boxGeometry = new THREE.BoxGeometry(10, 10, 10);\n</code></pre></div>\n<p>In this case we define a simple cube that is 10 x 10 x 10 units. The geometry itself is not enough though — we also need a material that will be used for our shape.</p>"}},{"type":"prose","value":{"id":"material","title":"Material","isH3":false,"content":"<p>Material is that thing covering the object — the colors or texture on its surface. In our case we will use a simple blue color to paint our box. There are predefined materials that can be used: Basic, Phong, Lambert. We will play with the last two later on, but for now the Basic one should be enough:</p>\n<div class=\"code-example\"><div class=\"example-header\"><span class=\"language-name\">js</span></div><pre class=\"brush: js notranslate\"><code>var basicMaterial = new THREE.MeshBasicMaterial({ color: 0x0095dd });\n</code></pre></div>\n<p>Add this line below the previous one.</p>\n<p>Our material is ready, but what to do next?</p>"}},{"type":"prose","value":{"id":"mesh","title":"Mesh","isH3":false,"content":"<p>To apply the material to a geometry a mesh is used. It takes a shape and adds the specified material to every face:</p>\n<div class=\"code-example\"><div class=\"example-header\"><span class=\"language-name\">js</span></div><pre class=\"brush: js notranslate\"><code>var cube = new THREE.Mesh(boxGeometry, basicMaterial);\n</code></pre></div>\n<p>Again, add this line below the previous one.</p>"}},{"type":"prose","value":{"id":"adding_the_cube_to_the_scene","title":"Adding the cube to the scene","isH3":false,"content":"<p>We've now created the actual cube using the geometry and material defined earlier. The last thing to do is to actually add the cube to our scene — add this line below the previous one:</p>\n<div class=\"code-example\"><div class=\"example-header\"><span class=\"language-name\">js</span></div><pre class=\"brush: js notranslate\"><code>scene.add(cube);\n</code></pre></div>\n<p>If you save and refresh now, your object will look like a square, because it's facing the camera. The good thing about objects is that we can move them on the scene however we want, for example rotating and scaling as we like. Let's apply a little bit of rotation to the cube, so we can see more than one face — again, add below the previous one:</p>\n<div class=\"code-example\"><div class=\"example-header\"><span class=\"language-name\">js</span></div><pre class=\"brush: js notranslate\"><code>cube.rotation.set(0.4, 0.2, 0);\n</code></pre></div>\n<p>Congratulations, you've created your first object in a 3D environment! It was easier than you thought, right? Here's how it should look:</p>\n<p><img src=\"/zh-CN/docs/Games/Techniques/3D_on_the_web/Building_up_a_basic_demo_with_Three.js/cube.png\" alt=\"Blue cube on a gray background rendered with Three.js.\" width=\"600\" height=\"400\" loading=\"lazy\"></p>\n<p>And here's the code we have created so far:</p>\n<p><iframe allowfullscreen=\"allowfullscreen\" width=\"756\" height=\"350\" src=\"https://jsfiddle.net/end3r/bwup75fa/embedded/\" loading=\"lazy\"></iframe></p>\n<p>You can also <a href=\"https://github.com/end3r/MDN-Games-3D/blob/gh-pages/Three.js/cube.html\" class=\"external\" target=\"_blank\">check it out on GitHub</a>.</p>"}},{"type":"prose","value":{"id":"more_shapes_and_materials","title":"More shapes and materials","isH3":false,"content":"<p>Now we will add more shapes to the scene and explore other shapes, materials, lighting, and more. Let's move the cube to the left to make space for some friends — add the following line just below the previous one:</p>\n<div class=\"code-example\"><div class=\"example-header\"><span class=\"language-name\">js</span></div><pre class=\"brush: js notranslate\"><code>cube.position.x = -25;\n</code></pre></div>\n<p>Now onto the shapes and materials: what would you say for a torus using the Phong material? Try adding the following lines just below the lines that define the cube.</p>\n<div class=\"code-example\"><div class=\"example-header\"><span class=\"language-name\">js</span></div><pre class=\"brush: js notranslate\"><code>var torusGeometry = new THREE.TorusGeometry(7, 1, 6, 12);\nvar phongMaterial = new THREE.MeshPhongMaterial({ color: 0xff9500 });\nvar torus = new THREE.Mesh(torusGeometry, phongMaterial);\nscene.add(torus);\n</code></pre></div>\n<p>Thee lines will add a torus geometry; the <code>TorusGeometry()</code> method's parameters define and the parameters are <code>radius</code>, <code>tube diameter</code>, <code>radial segment count</code> and <code>tubular segment count</code>. The Phong material should look more glossy than the simple color of the box that was using the Basic material, although at the moment it will just look black.</p>\n<p>We can have even crazier predefined shapes; let's play some more — add the following lines below the ones that defined the torus:</p>\n<div class=\"code-example\"><div class=\"example-header\"><span class=\"language-name\">js</span></div><pre class=\"brush: js notranslate\"><code>var dodecahedronGeometry = new THREE.DodecahedronGeometry(7);\nvar lambertMaterial = new THREE.MeshLambertMaterial({ color: 0xeaeff2 });\nvar dodecahedron = new THREE.Mesh(dodecahedronGeometry, lambertMaterial);\ndodecahedron.position.x = 25;\nscene.add(dodecahedron);\n</code></pre></div>\n<p>This time we are creating a dodecahedron, which is a shape containing twelve flat faces. The parameter <code>DodecahedronGeometry()</code> takes is the size of the object. We're using a Lambert material here, which is similar to Phong, but should be less glossy (again, black for now.) We're moving the object to the right, so it's not in the same place as the box or torus.</p>\n<p>As mentioned above, the new objects currently just look black. To have both the Phong and Lambert materials properly visible we need a source of light.</p>"}},{"type":"prose","value":{"id":"lights","title":"Lights","isH3":false,"content":"<p>There are various types of light sources available in Three.js; the most basic one is the <code>PointLight</code>, which works like a flashlight — shinig a spotlight in a given direction. Add the following below your shapre definitions:</p>\n<div class=\"code-example\"><div class=\"example-header\"><span class=\"language-name\">js</span></div><pre class=\"brush: js notranslate\"><code>var light = new THREE.PointLight(0xffffff);\nlight.position.set(-10, 15, 50);\nscene.add(light);\n</code></pre></div>\n<p>We define a white point of light, set it's position a bit away from the center of the scene so it can light up some parts of the shapes, and add it to the scene. Now everything works as it should — all three shapes are visible. You should check the documentation for other types of light like Ambient, Directional, Hemisphere or Spot, and experiment with placing them on the scene to see the effects.</p>\n<p><img src=\"/zh-CN/docs/Games/Techniques/3D_on_the_web/Building_up_a_basic_demo_with_Three.js/shapes.png\" alt=\"Shapes: blue cube, dark yellow torus and dark gray dodecahedron on a gray background rendered with Three.js.\" width=\"600\" height=\"400\" loading=\"lazy\"></p>\n<p>This looks a little bit boring though. In a game something is usually happening — we can see animations and such — so let's try to breathe a little life into those shapes by animating them.</p>"}},{"type":"prose","value":{"id":"animation","title":"Animation","isH3":false,"content":"<p>We already used rotation to adjust the position of the cube; we could also scale the shapes, or change thier positions. To show actual animation, we need to make changes to these values inside the render loop so, they are updated on every frame.</p>"}},{"type":"prose","value":{"id":"rotation","title":"Rotation","isH3":true,"content":"<p>Rotating is quite easy — all you need to do is to add a defined value to the given direction of the rotation on each frame. Add this line of code right after the <code>requestAnimationFrame()</code> invocation in the <code>render</code> function:</p>\n<div class=\"code-example\"><div class=\"example-header\"><span class=\"language-name\">js</span></div><pre class=\"brush: js notranslate\"><code>cube.rotation.y += 0.01;\n</code></pre></div>\n<p>It will rotate the cube on every frame by a tiny bit, so it will look like a smooth animation.</p>"}},{"type":"prose","value":{"id":"scaling","title":"Scaling","isH3":true,"content":"<p>We can also scale a given object. By applying a constant value we could make it grow or shrink once, but let's make it more interesting. First, we will need a helper variable called <code>t</code> for counting the elapsed time. Add it right before the <code>render()</code> function:</p>\n<div class=\"code-example\"><div class=\"example-header\"><span class=\"language-name\">js</span></div><pre class=\"brush: js notranslate\"><code>var t = 0;\n</code></pre></div>\n<p>Now let's increase the value by a given constant value on each frame of the animation; add the following lines just below the <code>requestAnimationFrame()</code> invocation:</p>\n<div class=\"code-example\"><div class=\"example-header\"><span class=\"language-name\">js</span></div><pre class=\"brush: js notranslate\"><code>t += 0.01;\ntorus.scale.y = Math.abs(Math.sin(t));\n</code></pre></div>\n<p>This way we'll be able to use <code>Math.sin</code> and end up with quite an interesting result: this will scale the torus and repeat the whole process, as <code>sin</code> is a periodic function. We're wrapping the scale value in <code>Math.abs</code> to pass the absolute values (greater or equal to 0), because sin is between -1 and 0, and for negative values the torus might render unexpectedly (in this case it looks black half the time.)</p>\n<p>Now onto the movement part.</p>"}},{"type":"prose","value":{"id":"moving","title":"Moving","isH3":true,"content":"<p>Beside rotation and scaling we can also move objects around the scene. Add the following, again just below the <code>requestAnimationFrame()</code> invocation:</p>\n<div class=\"code-example\"><div class=\"example-header\"><span class=\"language-name\">js</span></div><pre class=\"brush: js notranslate\"><code>dodecahedron.position.y = -7 * Math.sin(t * 2);\n</code></pre></div>\n<p>This will move the dodecahedron up and down by applying the <code>sin()</code> value to the y axis on each frame, with a little bit of adjustment to make it look cooler. Try changing the values to see how it affects the animations.</p>"}},{"type":"prose","value":{"id":"conclusion","title":"Conclusion","isH3":false,"content":"<p>Here's the final piece of the code:</p>\n<p><iframe allowfullscreen=\"allowfullscreen\" width=\"756\" height=\"350\" src=\"https://jsfiddle.net/rybr720u/embedded/\" loading=\"lazy\"></iframe></p>\n<p>You can also <a href=\"https://github.com/end3r/MDN-Games-3D/blob/gh-pages/Three.js/shapes.html\" class=\"external\" target=\"_blank\">see it on GitHub</a> and <a href=\"https://github.com/end3r/MDN-Games-3D/\" class=\"external\" target=\"_blank\">fork the repository</a> if you want to play with it yourself locally. Now you know the basics of Three.js, you can get back to the parent page about <a href=\"/zh-CN/docs/Games/Techniques/3D_on_the_web\">3D on the Web</a>.</p>\n<p>You should also try learning raw WebGL, so you can get a better understanding of what's going on. See our <a href=\"/zh-CN/docs/Web/API/WebGL_API\">WebGL documentation</a>.</p>"}}],"isActive":true,"isMarkdown":true,"isTranslated":true,"locale":"zh-CN","mdn_url":"/zh-CN/docs/Games/Techniques/3D_on_the_web/Building_up_a_basic_demo_with_Three.js","modified":"2024-12-13T12:17:17.000Z","native":"中文 (简体)","noIndexing":false,"other_translations":[{"locale":"en-US","title":"Building up a basic demo with Three.js","native":"English (US)"},{"locale":"de","title":"Aufbau eines einfachen Demos mit Three.js","native":"Deutsch"},{"locale":"fr","title":"Réaliser une démo basique avec Three.js","native":"Français"},{"locale":"ja","title":"Three.js を使った基本的なデモの作成","native":"日本語"},{"locale":"ru","title":"Создание простой сцены с помощью Three.js","native":"Русский"}],"pageTitle":"Building up a basic demo with Three.js - 游戏开发 | MDN","parents":[{"uri":"/zh-CN/docs/Games","title":"游戏开发"},{"uri":"/zh-CN/docs/Games/Techniques","title":"游戏开发技术"},{"uri":"/zh-CN/docs/Games/Techniques/3D_on_the_web","title":"Web 中的 3D 游戏"},{"uri":"/zh-CN/docs/Games/Techniques/3D_on_the_web/Building_up_a_basic_demo_with_Three.js","title":"Building up a basic demo with Three.js"}],"popularity":null,"short_title":"Building up a basic demo with Three.js","sidebarHTML":"<ol><li class=\"toggle\"><details><summary>简介</summary><ol><li><a href=\"/zh-CN/docs/Games/Introduction\">简介</a></li><li><a href=\"/zh-CN/docs/Games/Anatomy\">剖析</a></li></ol></details></li><li class=\"toggle\"><details><summary>游戏开发用到的 API</summary><ol><li><a href=\"/zh-CN/docs/Web/API/Canvas_API\">Canvas</a></li><li><a href=\"/zh-CN/docs/Web/CSS\">CSS</a></li><li><a href=\"/zh-CN/docs/Web/API/Fullscreen_API\">全屏</a></li><li><a href=\"/zh-CN/docs/Web/API/Gamepad_API\">游戏控制器</a></li><li><a href=\"/zh-CN/docs/Web/API/IndexedDB_API\">IndexedDB</a></li><li><a href=\"/zh-CN/docs/Web/JavaScript\">JavaScript</a></li><li><a href=\"/zh-CN/docs/Web/API/Pointer_Lock_API\">指针锁定</a></li><li><a href=\"/zh-CN/docs/Web/SVG\">SVG</a></li><li><a href=\"/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/TypedArray\">类型数组</a></li><li><a href=\"/zh-CN/docs/Web/API/Web_Audio_API\">Web 音频</a></li><li><a href=\"/zh-CN/docs/Web/API/WebGL_API\">WebGL</a></li><li><a href=\"/zh-CN/docs/Web/API/WebRTC_API\">WebRTC</a></li><li><a href=\"/zh-CN/docs/Web/API/WebSockets_API\">WebSocket</a></li><li><a href=\"/zh-CN/docs/Web/API/WebVR_API\">WebVR</a><abbr class=\"icon icon-nonstandard\" title=\"非标准。请在使用前检查跨浏览器支持。\">\n<span class=\"visually-hidden\">非标准</span>\n</abbr><abbr class=\"icon icon-deprecated\" title=\"已弃用。请不要在新的网站中使用。\">\n<span class=\"visually-hidden\">已弃用</span>\n</abbr></li><li><a href=\"/zh-CN/docs/Web/API/Web_Workers_API\">Web Worker</a></li><li><a href=\"/zh-CN/docs/Web/API/XMLHttpRequest\">XMLHttpRequest</a></li></ol></details></li><li class=\"toggle\"><details><summary>技术</summary><ol><li><a href=\"/zh-CN/docs/Games/Techniques/Async_scripts\">使用 asm.js 中的异步脚本</a></li><li><a href=\"/zh-CN/docs/Web/Performance/Optimizing_startup_performance\">优化启动性能</a></li><li><a href=\"/en-US/docs/Games/Techniques/WebRTC_data_channels\" class=\"only-in-en-us\">使用 WebRTC 点对点数据通道</a></li><li><a href=\"/en-US/docs/Games/Techniques/Audio_for_Web_Games\" class=\"only-in-en-us\">Web 游戏的音频</a></li><li><a href=\"/zh-CN/docs/Games/Techniques/2D_collision_detection\">2D 碰撞检测</a></li><li><a href=\"/en-US/docs/Games/Techniques/Tilemaps\" class=\"only-in-en-us\">平铺和平铺贴图概述</a></li></ol></details></li><li class=\"toggle\"><details open=\"\"><summary>Web 中的 3D 游戏</summary><ol><li><a href=\"/zh-CN/docs/Games/Techniques/3D_on_the_web\">概述</a></li><li><a href=\"/zh-CN/docs/Games/Techniques/3D_on_the_web/Basic_theory\">基本的 3D 理论</a></li><li><a href=\"/en-US/docs/Games/Techniques/3D_on_the_web/Building_up_a_basic_demo_with_A-Frame\" class=\"only-in-en-us\">使用 A-Frame 构建基础演示</a></li><li><a href=\"/en-US/docs/Games/Techniques/3D_on_the_web/Building_up_a_basic_demo_with_Babylon.js\" class=\"only-in-en-us\">使用 Babylon.js 构建基础演示</a></li><li><a href=\"/en-US/docs/Games/Techniques/3D_on_the_web/Building_up_a_basic_demo_with_PlayCanvas\" class=\"only-in-en-us\">使用 PlayCanvas 构建基础演示</a></li><li><em><a href=\"/zh-CN/docs/Games/Techniques/3D_on_the_web/Building_up_a_basic_demo_with_Three.js\" aria-current=\"page\">使用 Three.js 构建基础演示</a></em></li><li><a href=\"/en-US/docs/Games/Techniques/3D_on_the_web/WebXR\" class=\"only-in-en-us\">WebXR</a></li><li><a href=\"/zh-CN/docs/Games/Techniques/3D_collision_detection\">3D 碰撞检测</a></li><li><a href=\"/en-US/docs/Games/Techniques/3D_collision_detection/Bounding_volume_collision_detection_with_THREE.js\" class=\"only-in-en-us\">使用 THREE.js 进行边界体积碰撞检测</a></li></ol></details></li><li class=\"toggle\"><details><summary>实现游戏控制机制</summary><ol><li><a href=\"/zh-CN/docs/Games/Techniques/Control_mechanisms\">控制机制</a></li><li><a href=\"/zh-CN/docs/Games/Techniques/Control_mechanisms/Mobile_touch\">移动端触摸</a></li><li><a href=\"/en-US/docs/Games/Techniques/Control_mechanisms/Desktop_with_mouse_and_keyboard\" class=\"only-in-en-us\">通过鼠标和键盘控制的桌面端</a></li><li><a href=\"/en-US/docs/Games/Techniques/Control_mechanisms/Desktop_with_gamepad\" class=\"only-in-en-us\">通过游戏手柄控制的桌面端</a></li><li><a href=\"/en-US/docs/Games/Techniques/Control_mechanisms/Other\" class=\"only-in-en-us\">其他</a></li></ol></details></li><li class=\"toggle\"><details><summary>教程</summary><ol><li><a href=\"/zh-CN/docs/Games/Tutorials/2D_Breakout_game_pure_JavaScript\">使用纯 JavaScript 实现 2D 打砖块游戏</a></li><li><a href=\"/zh-CN/docs/Games/Tutorials/2D_breakout_game_Phaser\">使用 Phaser 实现 2D 打砖块游戏</a></li><li><a href=\"/en-US/docs/Games/Tutorials/HTML5_Gamedev_Phaser_Device_Orientation\" class=\"only-in-en-us\">具有设备方向检测功能的 2D 迷宫游戏</a></li><li><a href=\"https://mozdevs.github.io/html5-games-workshop/en/guides/platformer/start-here/\" class=\"external\" target=\"_blank\">使用 Phaser 实现 2D 平板游戏</a></li></ol></details></li><li class=\"toggle\"><details><summary>发布游戏</summary><ol><li><a href=\"/zh-CN/docs/Games/Publishing_games\">概述</a></li><li><a href=\"/zh-CN/docs/Games/Publishing_games/Game_distribution\">游戏分发</a></li><li><a href=\"/zh-CN/docs/Games/Publishing_games/Game_promotion\">游戏推广</a></li><li><a href=\"/zh-CN/docs/Games/Publishing_games/Game_monetization\">游戏盈利</a></li></ol></details></li></ol>","source":{"folder":"zh-cn/games/techniques/3d_on_the_web/building_up_a_basic_demo_with_three.js","github_url":"https://github.com/mdn/translated-content/blob/main/files/zh-cn/games/techniques/3d_on_the_web/building_up_a_basic_demo_with_three.js/index.md","last_commit_url":"https://github.com/mdn/translated-content/commit/dc6649b90bdfe093ee121d7936a1edf8455c51bc","filename":"index.md"},"summary":"游戏中一个典型的 3D 场景 (最简单的那种) 包含标准的物品比如在坐标轴中的形状,一个实际可看到他们的摄像机,灯光和材质让其看起来不错,动画使其生动等等。 Three.js, 和其他 3D 库一样,提供内置的 helper 函数来帮助你尽可能快地实现通用的 3D 功能 . 在这篇文章我们会带你了解使用 Three 的基本知识,包含设置开发者环境,必要的 HTML 结构,Three.js 对象基础,以及如何创建一个基本的 demo.","title":"Building up a basic demo with Three.js","toc":[{"text":"环境设置","id":"环境设置"},{"text":"HTML 结构","id":"html_结构"},{"text":"渲染器","id":"渲染器"},{"text":"场景","id":"场景"},{"text":"摄像机","id":"摄像机"},{"text":"Rendering the scene","id":"rendering_the_scene"},{"text":"Geometry","id":"geometry"},{"text":"Material","id":"material"},{"text":"Mesh","id":"mesh"},{"text":"Adding the cube to the scene","id":"adding_the_cube_to_the_scene"},{"text":"More shapes and materials","id":"more_shapes_and_materials"},{"text":"Lights","id":"lights"},{"text":"Animation","id":"animation"},{"text":"Conclusion","id":"conclusion"}],"pageType":"guide"}}</script></body></html>