|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const React = require('react'); |
|
|
|
|
|
const CompLibrary = require('../../core/CompLibrary.js'); |
|
|
|
|
|
const MarkdownBlock = CompLibrary.MarkdownBlock; |
|
|
const Container = CompLibrary.Container; |
|
|
const GridBlock = CompLibrary.GridBlock; |
|
|
const bash = (...args) => `~~~bash\n${String.raw(...args)}\n~~~`; |
|
|
class HomeSplash extends React.Component { |
|
|
render() { |
|
|
const {siteConfig, language = ''} = this.props; |
|
|
const {baseUrl, docsUrl} = siteConfig; |
|
|
const docsPart = `${docsUrl ? `${docsUrl}/` : ''}`; |
|
|
const langPart = `${language ? `${language}/` : ''}`; |
|
|
const docUrl = doc => `${baseUrl}${docsPart}${langPart}${doc}`; |
|
|
|
|
|
const SplashContainer = props => ( |
|
|
<div className="homeContainer"> |
|
|
<div className="homeSplashFade"> |
|
|
<div className="wrapper homeWrapper">{props.children}</div> |
|
|
</div> |
|
|
</div> |
|
|
); |
|
|
|
|
|
const Logo = props => ( |
|
|
<div className="splashLogo"> |
|
|
<img src={props.img_src} alt="Project Logo" /> |
|
|
</div> |
|
|
); |
|
|
|
|
|
const ProjectTitle = props => ( |
|
|
<h2 className="projectTitle"> |
|
|
<small>{props.tagline}</small> |
|
|
</h2> |
|
|
); |
|
|
|
|
|
const PromoSection = props => ( |
|
|
<div className="section promoSection"> |
|
|
<div className="promoRow"> |
|
|
<div className="pluginRowBlock">{props.children}</div> |
|
|
</div> |
|
|
</div> |
|
|
); |
|
|
|
|
|
const Button = props => ( |
|
|
<div className="pluginWrapper buttonWrapper"> |
|
|
<a className="button" href={props.href} target={props.target}> |
|
|
{props.children} |
|
|
</a> |
|
|
</div> |
|
|
); |
|
|
|
|
|
return ( |
|
|
<SplashContainer> |
|
|
<Logo img_src={baseUrl + 'img/pytorch3dlogowhite.svg'} /> |
|
|
<div className="inner"> |
|
|
<ProjectTitle tagline={siteConfig.tagline} title={siteConfig.title} /> |
|
|
<PromoSection> |
|
|
<Button href={docUrl('why_pytorch3d.html')}>Docs</Button> |
|
|
<Button href={`${baseUrl}tutorials/`}>Tutorials</Button> |
|
|
<Button href={'#quickstart'}>Get Started</Button> |
|
|
</PromoSection> |
|
|
</div> |
|
|
</SplashContainer> |
|
|
); |
|
|
} |
|
|
} |
|
|
|
|
|
function SocialBanner() { |
|
|
return ( |
|
|
<div className="socialBanner"> |
|
|
<div> |
|
|
Support Ukraine 🇺🇦{' '} |
|
|
<a href="https://opensource.fb.com/support-ukraine"> |
|
|
Help Provide Humanitarian Aid to Ukraine |
|
|
</a> |
|
|
. |
|
|
</div> |
|
|
</div> |
|
|
); |
|
|
} |
|
|
|
|
|
class Index extends React.Component { |
|
|
render() { |
|
|
const {config: siteConfig, language = ''} = this.props; |
|
|
const {baseUrl} = siteConfig; |
|
|
|
|
|
const Block = props => ( |
|
|
<Container |
|
|
padding={['bottom', 'top']} |
|
|
id={props.id} |
|
|
background={props.background}> |
|
|
<GridBlock |
|
|
align="center" |
|
|
contents={props.children} |
|
|
layout={props.layout} |
|
|
/> |
|
|
</Container> |
|
|
); |
|
|
|
|
|
const Description = () => ( |
|
|
<Block background="light"> |
|
|
{[ |
|
|
{ |
|
|
content: |
|
|
'This is another description of how this project is useful', |
|
|
image: `${baseUrl}img/docusaurus.svg`, |
|
|
imageAlign: 'right', |
|
|
title: 'Description', |
|
|
}, |
|
|
]} |
|
|
</Block> |
|
|
); |
|
|
|
|
|
const pre = '```'; |
|
|
|
|
|
const codeExample = `${pre}python |
|
|
from pytorch3d.utils import ico_sphere |
|
|
from pytorch3d.io import load_obj |
|
|
from pytorch3d.structures import Meshes |
|
|
from pytorch3d.ops import sample_points_from_meshes |
|
|
from pytorch3d.loss import chamfer_distance |
|
|
|
|
|
# Use an ico_sphere mesh and load a mesh from an .obj e.g. model.obj |
|
|
sphere_mesh = ico_sphere(level=3) |
|
|
verts, faces, _ = load_obj("model.obj") |
|
|
test_mesh = Meshes(verts=[verts], faces=[faces.verts_idx]) |
|
|
|
|
|
# Differentiably sample 5k points from the surface of each mesh and then compute the loss. |
|
|
sample_sphere = sample_points_from_meshes(sphere_mesh, 5000) |
|
|
sample_test = sample_points_from_meshes(test_mesh, 5000) |
|
|
loss_chamfer, _ = chamfer_distance(sample_sphere, sample_test) |
|
|
`; |
|
|
|
|
|
const QuickStart = () => ( |
|
|
<div |
|
|
className="productShowcaseSection" |
|
|
id="quickstart" |
|
|
style={{textAlign: 'center'}}> |
|
|
<h2>Get Started</h2> |
|
|
<Container> |
|
|
<ol> |
|
|
<li> |
|
|
<strong>Install PyTorch3D </strong> (following the instructions <a href="https://github.com/facebookresearch/pytorch3d/blob/main/INSTALL.md">here</a>) |
|
|
</li> |
|
|
<li> |
|
|
<strong>Try a few 3D operators </strong> |
|
|
e.g. compute the chamfer loss between two meshes: |
|
|
<MarkdownBlock>{codeExample}</MarkdownBlock> |
|
|
</li> |
|
|
</ol> |
|
|
</Container> |
|
|
</div> |
|
|
); |
|
|
|
|
|
const Features = () => ( |
|
|
<div className="productShowcaseSection" style={{textAlign: 'center'}}> |
|
|
<Block layout="fourColumn"> |
|
|
{[ |
|
|
{ |
|
|
content: |
|
|
'Supports batching of 3D inputs of different sizes ' + |
|
|
'such as meshes' , |
|
|
image: `${baseUrl}img/batching.svg`, |
|
|
imageAlign: 'top', |
|
|
title: 'Heterogeneous Batching', |
|
|
}, |
|
|
{ |
|
|
content: |
|
|
'Supports optimized implementations of ' + |
|
|
'several common functions for 3D data', |
|
|
image: `${baseUrl}img/ops.png`, |
|
|
imageAlign: 'top', |
|
|
title: 'Fast 3D Operators', |
|
|
}, |
|
|
{ |
|
|
content: |
|
|
'Modular differentiable rendering API ' + |
|
|
'with parallel implementations in ' + |
|
|
'PyTorch, C++ and CUDA' , |
|
|
image: `${baseUrl}img/rendering.svg`, |
|
|
imageAlign: 'top', |
|
|
title: 'Differentiable Rendering', |
|
|
}, |
|
|
]} |
|
|
</Block> |
|
|
</div> |
|
|
); |
|
|
|
|
|
const Showcase = () => { |
|
|
if ((siteConfig.users || []).length === 0) { |
|
|
return null; |
|
|
} |
|
|
|
|
|
const showcase = siteConfig.users |
|
|
.filter(user => user.pinned) |
|
|
.map(user => ( |
|
|
<a href={user.infoLink} key={user.infoLink}> |
|
|
<img src={user.image} alt={user.caption} title={user.caption} /> |
|
|
</a> |
|
|
)); |
|
|
|
|
|
const pageUrl = page => baseUrl + (language ? `${language}/` : '') + page; |
|
|
|
|
|
return ( |
|
|
<div className="productShowcaseSection paddingBottom"> |
|
|
<h2>Who is Using This?</h2> |
|
|
<p>This project is used by all these people</p> |
|
|
<div className="logos">{showcase}</div> |
|
|
<div className="more-users"> |
|
|
<a className="button" href={pageUrl('users.html')}> |
|
|
More {siteConfig.title} Users |
|
|
</a> |
|
|
</div> |
|
|
</div> |
|
|
); |
|
|
}; |
|
|
|
|
|
return ( |
|
|
<div> |
|
|
<SocialBanner /> |
|
|
<HomeSplash siteConfig={siteConfig} language={language} /> |
|
|
<div className="landingPage mainContainer"> |
|
|
<Features /> |
|
|
<QuickStart /> |
|
|
</div> |
|
|
</div> |
|
|
); |
|
|
} |
|
|
} |
|
|
|
|
|
module.exports = Index; |
|
|
|