Comments (8)
By default, the environment cube map comes from a standard resource image.
It is still not in stable (confirmed full working) state but you can try this
@Override
public void onSessionConfiguration(Session session, Config config) {
config.setLightEstimationMode(Config.LightEstimationMode.ENVIRONMENTAL_HDR);
arSceneView.setLightEstimationEnabled(true)
}
With this, the environment will be the ARCore returned one.
It is more realistic but less spectacular since the ARCore returned environmental cube map is (since now) quite low resolution (16x16x16x16x16x16)
You can have a look at this discussion for more infos: IndirectLight in an AR context
from sceneform-android.
@ThomasGorisse I am sorry but I dont get it from your post. Is it possible to change default HDR map? I can see that the default is used for building light probe here . Is there anyway how to change it?
from sceneform-android.
You can override in your app the .hdr file here: https://github.com/ThomasGorisse/sceneform-android-sdk/tree/master/core%2Fassets-sources%2Flights%2Fsceneform_default_light_probe
Or move the old .hdr lightning system to the last Filament KTLoader using the others environment files which are not used actually but should.
It will be great to make a PR on this if you have time.
Every contributor is welcome.
from sceneform-android.
@ThomasGorisse Thank you. Unfortunately this does not work. It looks like this file is actually not used. It is somehow baked into this.
Because if I added new HDR file and change DEFAULT_LIGHTPROBE_ASSET_NAME it ended with this error
2021-07-31 17:53:57.994 10021-10086/? E/Scene: Failed to create the default Light Probe:
java.util.concurrent.CompletionException: java.lang.IllegalArgumentException: Light Probe asset "christmas_photo_studio_01_2k" not found in bundle.
If I dont change name and just replace HDR file it does not change reflection image (so I assume that it is not changed and it is loaded from that SFB file).
I am not sure if I can rewrite it to KTXLoader and made pull request but I will try it.
from sceneform-android.
You are very probably right about the fact that the environment is inside the sfb.
I think I put the original .hdr here because I wanted to keep/save the source file.
You can use the 2 other files in the same folder to load them using the Filament KTXLoader.
You may probably have to generate them again if the versions are too old.
For the rest of the actual sfb content you can just add a breakpoint at the Filament Indirect Light creation to see what values are used.
Then try to find how to pass the same values to the loaded ktxs.
If you can do it, it would be awesome for this Sceneform repo since it's the last SFB usage and so we could remove a lot of unused code.
For exemples of KTX loading, you can have a look at https://github.com/zirman/arcore-filament-example-app and https://github.com/ThomasGorisse/realitycore and directly on the Filament repo https://github.com/google/filament
from sceneform-android.
@ThomasGorisse Thank you again for your advice. I am struggling with this because I am not Android developer. I cannot find any usage of KTXLoader in that repos you mentiond. Right now I am just exploring LightProbe class and trying to modify it only to load KTX file.
I tried to change loadInBackground method to load IndirectLight instead of LightingDef (if I could manage to do that it will be good starting point to figure out how to rewrite LightingProbe class to use KTX instead of SFB. But I am stuck on that KTXLoader. Maybe I am using it wrong. In this code:
private CompletableFuture<IndirectLight> loadInBackground(
Callable<InputStream> inputStreamCreator) {
return CompletableFuture.supplyAsync(
() -> {
if (inputStreamCreator == null) {
throw new IllegalArgumentException("Invalid source.");
}
@Nullable ByteBuffer assetData = null;
// Open and read the texture file.
try (InputStream inputStream = inputStreamCreator.call()) {
assetData = SceneformBufferUtils.readStream(inputStream);
} catch (Exception e) {
throw new CompletionException(e);
}
if (assetData == null) {
throw new AssertionError(
"The Sceneform bundle containing the Light Probe could not be loaded.");
}
return KTXLoader.INSTANCE.createIndirectLight(EngineInstance.getEngine().getFilamentEngine(), assetData, new KTXLoader.Options());
},
ThreadPools.getThreadPoolExecutor());
}
On that KTXLoader I always get error:
2021-08-01 11:58:06.721 8971-9021/com.google.ar.sceneform.samples.gltf E/Scene: Failed to create the default Light Probe:
java.util.concurrent.CompletionException: java.lang.UnsatisfiedLinkError: No implementation found for long com.google.android.filament.utils.KTXLoader.nCreateIndirectLight(long, java.nio.Buffer, int, boolean) (tried Java_com_google_android_filament_utils_KTXLoader_nCreateIndirectLight and Java_com_google_android_filament_utils_KTXLoader_nCreateIndirectLight__JLjava_nio_Buffer_2IZ)
at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:278)
at java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:284)
at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1629)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:919)
Caused by: java.lang.UnsatisfiedLinkError: No implementation found for long com.google.android.filament.utils.KTXLoader.nCreateIndirectLight(long, java.nio.Buffer, int, boolean) (tried Java_com_google_android_filament_utils_KTXLoader_nCreateIndirectLight and Java_com_google_android_filament_utils_KTXLoader_nCreateIndirectLight__JLjava_nio_Buffer_2IZ)
at com.google.android.filament.utils.KTXLoader.nCreateIndirectLight(Native Method)
at com.google.android.filament.utils.KTXLoader.createIndirectLight(KTXLoader.kt:61)
at com.google.ar.sceneform.rendering.LightProbe.lambda$loadInBackground$1(LightProbe.java:338)
at com.google.ar.sceneform.rendering.-$$Lambda$LightProbe$EhG1XJmBzKuk42Eeyu6SrJmRNOE.get(Unknown Source:2)
It looks like it is incompatible types directly in com.google.android.filament because nCreateIndirectLight expects Long (as wrapper object for primitive data type long) but Engine returns long as primitive data type. I cannot find any KTXLoader usage so I dont know if I am doing something wrong or if it is really bug inside Filament.
from sceneform-android.
You can go with Kotlin if you are more confortable with this language.
The plan is to move class by class to Kotlin.
For a recent and accurate sample of KTX loading, the Filament ModelViewer is updated frequently here:
https://www.github.com/google/filament/tree/main/android%2Fsamples%2Fsample-gltf-viewer%2Fsrc%2Fmain%2Fjava%2Fcom%2Fgoogle%2Fandroid%2Ffilament%2Fgltf%2FMainActivity.kt
from sceneform-android.
Environment Lights are now available since this release: Environment Lights + Augmented Faces + Kotlin Begins + Green Flickering Fix + Performances
from sceneform-android.
Related Issues (20)
- Shadow position is not correct, shadow appears at the middle of the object. HOT 2
- VideoNode Size Problem HOT 3
- Unauthorized Access Error for Sceneform Dependency Version 1.22.0 HOT 2
- What is Engine and how to use it? HOT 1
- How To Change Texture Images HOT 2
- Color of model on scene doesn't match color of texture (warm white instead of white) HOT 2
- Failed to create arsession HOT 4
- How to combine multiple node into one HOT 2
- java.lang.IllegalStateException: Calling method on destroyed View when i have scene inside horizontalpager
- Camera doesn't open and crashes when Proguard is enabled (R8) in Sceneform. HOT 1
- measure with camera HOT 2
- Scan Qr code using sceneform HOT 2
- Crash on App Start: NoSuchMethodError for acquireEnvironmentalHdrCubeMap HOT 3
- sceneform AugmentedFaceNode performance HOT 2
- Scan Human Skin HOT 1
- how to get a image in portrait mode HOT 1
- Support for Compose Multiplatform
- Support for Android 14 devices HOT 6
- How to remove hand motion animation?
- (Java) App crashes on device HOT 6
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from sceneform-android.