My Room in 3D
my-room-in-3d.vercel.app
my-room-in-3d.vercel.app
I would recommend everyone try it out for themselves to see what I’m talking about. No matter how much you try, there is always something too dark or light. Always something that looks like made from minecraft blocks and something too detailed for those 2 objects to be from the same universe. Animations are either too stiff or move like jelly blobs.
How is this so perfect?! I just can’t comprehend how do 3d artist’s brains work.
That's it. There's no shortcut to being good at this stuff, you just have to learn how the real world works and make sure that when you're simulating it in the computer you're using physically correct numbers for everything. Relentlessly comparing what you're doing to photographs is the only way to truly master the skill. It's a lot easier to take a step back and do stylized realism once you can nail the real thing.
That being said this is fantastically executed. I'm especially loving the ability to mix the baked GI live, it's a great effect for static scenes like this.
P.S. Ok I probably lied when I said there are no shortcuts. Here are a few:
- use a physically based (preferably unbiased) renderer
- use only energy conserving materials
- use light-probes to light your scene
This document is a good primer on a lot of the concepts that go into PBR. I have a few more open source/free resources on PBR and unbiased rendering as well and I will update this post if I can dig em up.
To put it differently: this is what renderers were aspiring to from the start, but couldn't quite reach initially in real world applications because if a severe lack of computing power. So, for the better part of three decades, computer graphics relied on ugly shortcuts that required laborious workarounds from skilled artists. With the right tools you just don't need a lot of them anymore.
I love doing 3D stuff for fun - but like you, everything looks like minecraft blocks from different worlds. Certainly not real.
But if you open Blender and put a couple of cubes in a scene and render it using Cycles (in the Scene tab change the Render Engine dropdown from the default Eevee) then the cubes looks way better: https://imgur.com/a/q9xvZeI
The ambient occlusion, and proper light bouncing and reflections make even the boring-est cubes look pretty good!
Second, lighting is a careful balance, but in general, the simpler the rig, the better. Pull an IBL HDR map from somewhere, use a single directional light, and let the bounce lighting do the main work here. Outdoors looks gorgeous and that's a single directional light, and a ton of bounce. And that's the same thing providing the light in this room scene as well.
Third, learn the tricks and technologies. Learn about lightmapping, about shadow mapping, about the different shader tricks, about why real-time transparency is hard. Yes, libraries like Three.JS can abstract over some of this, but some fundamentals in the tech can help you focus on the things that will work, and the things that don't. Simon Schreibt has some excellent guides and tutorials that are artist-focused about tech art.
The lightning here isn't realtime: just a bunch of baked lightmaps fading in and out. Not even SH probes!
There is sun, which is slightly yellowish (or orange to red at sunset), and there is sky light which is obviously bluish. Sun is directional, sky light is not. Sun is a light source far away, but sky is a light source all around the scene.
The rest, well, can be done with a lot of bouncing, refraction, diffusion subsurface scattering, etc.
[0] The classic is Naty Hoffman's 2002 work on atmospheric scattering http://developer.amd.com/wordpress/media/2012/10/GDC_02_Hoff... , but it has been developed over the years, e.g. Sebastian Hillaire's work on both Frostbite https://media.contentapi.ea.com/content/dam/eacom/frostbite/... and Unreal Engine https://blog.selfshadow.com/publications/s2020-shading-cours...
In all realistic rendering software, skylight and sun (or other celestial bodies, like Moon) are modeled as separate sources of light, with different light characteristics.
The sun light is white during the day, otherwise, anything white would appear yellow.
If the sun color was actually yellow, people wouldn't be able to tell the difference between a white object and yellow object under the sun light (they would both appear yellow). And clearly they are.
On the other hand a white object doesn't get any "whiter" under another kind of light than it appears under direct sun light, this again is because the sun light is white, and not yellow.
Of course there is some subjectivity here, but it is a misconception to call the sun light yellow. For example, this "bright sun" RGB [1] color, is clearly not the color of direct sun light. Hopefully, you will agree with this.
A yellow object and a white object would be not discernible under a very narrow-band yellow light, or a mix of two narrow-band red and green lights of right proportions. This is how LEDs and lasers emit light, but totally unlike hot objects (like Sun) or fluorescent lamps (like "natural light" LED lamps) emit light.
It has to be because white was historically described as the color of the snow (or whatever is white) under the sunlight.
Now, if you want to adopt a more precise definition of white and other colors, based on (not so) recent scientific insights about the light, you can. Then the sunlight is not white, neither is snow or sugar. And is also certainly not yellow.
Let's be honest, the sun light is almost perfectly white, and kids use yellow to draw the sun, because it wouldn't make sense to draw it with white.
The eye has a built-in white balance correction, and it moves the white point towards longer waves as the brightness lowers. This is why a single 5600K lamp in a room makes bluish light, while 10 of the same lamps make it lit by bright white. Same, a single 2500K lamp in a room makes a calming sort-of-white light. but 10 such lamps make a unmistakably yellow light.
The sunlight outside at a cloudless summer noon is very bright (one usually even wants to wear sunglasses), so the sun looks white or yellowish, especially in contrast to the blue sky.
As I said, human vision has a kind of adaptive white balance that cancels out peaks like this to some extent. It also does that for artificial light sources with uneven spectra (neon light, blueish white LED lights...). [Side note: this is also the reason why cameras have adjustable white balance. A picture taken by a neutral sensor under some artificial lights is perfectly correct, but looks color tinted and wrong to the human eye afterwards, because the eye under the same conditions has a shifted white point.]
Why is this important? If you set up a light source in a renderer, you often get a pretty naive equal energy white as a default, which is simply not what you need for sunlight, even at noon under a clear sky.
I don't really do any visual art outside of graphics programing, I don't see myself as an artist, I'm very much not a visual thinker, and my deuteranomaly does make some aspects of my work harder at times.
Besides all that I've found I can do a good job and get some really nice looking results just by focusing on an understanding of the underlying equations and common tricks like mentioned above.
[0] https://steamcdn-a.akamaihd.net/apps/valve/2007/NPAR07_Illus...
But yes, understanding some physical basis for lighting is helpful even for non-photo-realistic rendering.
If you look at this scene, I'm fairly certain all the lighting is prebaked in something like blender/maya etc.
There's also a lot of other little environment art things you can do. For instance, small bevels on sharp edges help things look more natural (look around your house and you'll notice even sharp corners aren't as sharp as you think). Adding roughness and specular lighting to materials helps a bit too, even things like wood or asphalt have some amount of reflectiveness at certain angles.
If you can, go for global illumination over abient occlusion if you want a realistic look. Ambient occlusion is a pretty rough approximation of diffuse light from the surroundings. A proper global illumination rendering captures the same effect more accurately. You get a lot of subtle hues in the lighting which instantly make even flat single color surfaces more interesting and real.
You can also go over board with your materials, adding texture maps for roughness and normals, which vary how the surface reacts to the light. There are plenty of free materials out there that demonstrate what I mean. But good texturing is a topic all of its own, with its own tools and processes. If you start to add textures, my advice would be to keep them really, really subtle. The amount of variation you really need is a lot less than you would probably think.
You mean that not just anyone can be a 3D artist and make a Pixar movie? Say it ain't so!! /s
However, it is kind of insulting that someone would think they could just walk up to a block of stone with a hammer and chisel and think they will create the David. Now imagine it is the fisher price version of that hammer and chisel.
Threejs and Blender might be capable for certain things and calling it fisher price is not fair either, but there are definite limitations.
>How is this so perfect?! I just can’t comprehend how do 3d artist’s brains work.
Honestly, this looks closer to game engine rendering than something from a photo realistic engine.
It's just a lot of work. A lot more people (on average seem to) think it is.
Can't you just... means they have no fucking clue.
honestly making art is almost always like that, and what makes it easier is not necessarily what makes you better artist, a lot of people find "shortcuts" what you'd call a style, put certain lighting in, certain forms, and that makes it really easy to skip the middle part and just work with your established artistic vocabulary but it's not what will push you to create better art...
I'm not sure what I said was helpful but I have completely gone through that process you mentioned over and over.
Particularly the part about not being satisfied until you exactly execute what you had in mind, as opposed to funneling everything through layered techniques that lose fidelity.
The problem with this is that it involves reacquiring orientation over and over. Each time that is done successfully, it becomes easier to hold onto more details at the same time, and execute with more finesse, but it requires the interest in the subject to come from a very fundamental place in order to keep getting back on the horse with a centered mindset that retains focus on the bigger picture, and doesn't get distracted with shortcuts like you mentioned.
Only later I discovered it was the font size few pts smaller, the padding 1 pixel larger, the color little bit less contrasting, the 1px additional light border on top of dark border, the shadow a bit more blurry and million subtle things you can get right and balanced only with experience.
Was recommended https://www.youtube.com/watch?v=m9AT7H4GGrA a little while back, it basically goes 'round in circles a bunch of times describing exactly what you're talking about, then recommends Filmic Blender. I kind of hit my TL;DR point at ~12min.
I have no idea if this information is relevant or insightful. Hopefully at some point I'll be able to play around with this stuff one day. (This machine hits 100°C if I try and play *video*... HP thermal design FTW. Not even going to try launching blender, no need to prove it'll melt everything lol)
https://www.youtube.com/watch?v=Hm7fdd8TD7Y&list=PL5nApUt6Z8...
Rather than me clumsily explaining with text how to get this right and have your artwork "pop" with very little effort, watch this video titled "The Secret Ingredient to Photorealism": https://www.youtube.com/watch?v=m9AT7H4GGrA
Combine that with physically correct materials and rendering, and you could literally "sketch" a handful of grey boxes with a single area light and have it nearly pop out of the screen with uncanny realism!
The #2 tip is that chances are that you're probably working with a cheap LCD monitor. Even for $600-$1000 you can get a very decent monitor with DCI-P3 or AdodeRGB wide gamut support and more accurate colour. That helps to produce content that is consistent and correct. That, or invest in a calibrator and set up your operating system colour management with the ICC profile of your panel. Without this, images you grab from Chrome or Firefox will shift in hue and/or brightness when you import them into image editing software. Test your browser with this site: https://cameratico.com/tools/web-browser-color-management-te...
The #3 tip is that you can make much better colour choices working in a perceptual space. The colour pickers in most software use trivial RGB 0..255 ranges mapped to a rectangle. This is garbage, criminally lazy, clownshoes programming. Yet, everybody does it, resulting in these "curtains of colour" controls: https://www.google.com/search?q=colors+picker+control&tbm=is...
You shouldn't be seeing those vertical streaks! The transitions should be smooth and even. An excellent space to use for picking colours or creating gradients is Oklab: https://bottosson.github.io/posts/oklab/
Notice how beautiful it looks compared to the other spaces, which are horribly uneven looking?
Even just these tips can make someone like me, a non-artist, produce beautiful images, web pages, or 3D models.
Art isn't magic, it's a technical skill and you can learn it!
If I could request some features:
The layout might be better 4-wide (or dynamically reflowing) instead of 3-wide so that typical PC monitors can view all of the controls at once.
Also, I'd love the ability to use Oklab to pick ranges of equal distributions (dark to light), or typical symmetric colour pairings (opposites, or 'n' divisions of a circle, or whatever...)
In the past, I used an app that allowed me to do that with the Munsell colour system, and I found that it worked great. The only annoyance with that was that it was fixed to 10% increments, and had limited symmetry types.
However, despite that, I could pick a colour that was perceptually 2x as saturated (or bright), and then use it for a control that was 1/2 as big as an adjacent one. It made things like almost eerily balanced. I felt like it was the cheat code to artistic web layouts!
For example: https://youtu.be/oT2DDu9vRJk
The issue with 3D tools is that in order to make real use of them you have to basically be a good photographer, you have to be extremely provicient with both natural and artifical lighting, you have to be very observant of the physical properties of materials, you have to model accurately and to scale etc. These are things any software can help you with, but just like the greatest piano won't make you a great pianist, a great 3d software won't make you produce great images.
Like any art form VFX and CGI depends on people who are willing to work on their results and learn from each other till they are perfect.
It's the website shown on the monitor in the room.
Worked like a charm for me. Im on linux
However, it seems somewhat brittle and sometimes the initial loading doesn't complete. I am not 100% certain, but it seems to help to switch to another tab while the page is loading. Feels a bit like a race condition while loading the engine which doesn't occur when the tab runs with a lower priority.
After pressing the Start button, everything works fine.
Makes me want to check out each of his individual projects.
Now, various WebGL frameworks (Three.js, Babylon.js, etc...) are more performant or easier to use or whatever. Or you can compile native 3D platforms to wasm. Which did you try?
Godot and Unity can both compile to wasm so I'd try out one of those.
OpenGL/Vulkan/DirectX can use 2021 hardware capabilites, WebGL is stuck on a GL ES 3.0 subset, basically 2012 hardware.
Cool if you want to do iPhone 6 style graphics, but that is about it.
Unreal Citadel was running in Flash, back in 2011.
What Unreal based games are making the headlines in WebGL 2.0?
Those people like Mr Simon here who take the time optimize every last bit can indeed make it purr.
Everything on the web starts as a framework or some proprietary bundle of some kind, and if it proves it's merit, it may just get built into the W3C standards themselves.
We currently have a low level tech (webGL) in W3C, and libraries like three.js are providing the get-you-by to elevate it to average code legibility, but I think we are still a long way off from having 3D be a javascript-native ability for the average developer in a peformant implementation, at which point we could really expect this www-metaverse experience getting hyped every which where to blow the lid on this two dimensional web we're currently stuck in.
Just like WASM is pretty much stuck in MVP 1.0, if one cares about support across most browsers.
And WebGPU, won't be much better, as it might finally land in 2022 as MVP 1.0, take again another 10 years for wide adoption and has a crazy mix of C++, Rust and HLSL shading language as compromise among all involved parties.
No wonder that streaming 3D as video, while using headless Vulkan and DirectX 12 Ultimate cards, seems to actually be the future of 3D on the Web.
1) Graffities : https://free-visit.net/fr/demo01
2) My kitchen : https://free-visit.net/fr/demo01/demo02
Disclaimer: I had the pleasure of having Bruno as an IRL teacher for some time ;)
If you want to use TypeScript, and you have time on your hands, maybe look at Babylon.js and compare it to Three.js.
Three.js has a huge community, learning 3D programming by learning three.js from the community is very feasible, lots of nice exemples around.
Babylon.js is maintained by a team of Microsoft employees. It is a cohesive piece of software with tons of integrated utilities (controls, GUI, good debugging tools, an excellent jsfiddle equivalent called playground etc). It is the perfect balance between a rendering and a game engine. Also it has a well engineered Typescript codebase that in my humble experience has been more stable than Three. The docs are great, the community is nice and super active, contributing is easy but you have much less online exemples than with Three.
So my advice for a 3D novice would be to play with Three.js and see where it goes. If you are in it for art and making things look good, the amount of examples with Three will also help a lot.
Now if you value engineering, and you already have even a very modest experience with 3D programming I really recommend Babylon.js
Also you will see Aframe, react-fiber or react-babylon thrown around: don't bother if you don't already know Three or Babylon. You will outgrow them and still have to learn Three/Babylon "the correct way". I think that most people decent with Three or Babylon can make their own specific abstraction with less overhead anyway.
However, I’ll echo the sibling comment here. I used Three.js and had some problems exporting it into my TypeScript project (using the DefinitelyTyped repo for type definitions). It eventually worked with a dumb js file that I copied over from Three and edited myself to make the export work in my project. This was in mid-2019.
Anyway, after getting that all working and moving on, I realized I should have at least tried Babylon because the code looked far more suitable for a TypeScript project. I never got around to porting over because it wasn’t crucial for my project, and Three was already working.
Based on that experience and the fact that I prefer ts, if I work on another project with 3D rendering in the browser, I’ll try Babylon.
If I worked with three.Js you’d get some spheres and a cube!
https://www.youtube.com/watch?v=Hm7fdd8TD7Y&list=PL5nApUt6Z8...
Can't find it anymore, but I'm glad we're going full circle with this trend :)
And I just got my Lightfield Lume Pad today for stuff like this.