spheres | CUDA raytracer that can render millions | Graphics library

 by   voxel-tracer C Version: Current License: No License

kandi X-RAY | spheres Summary

kandi X-RAY | spheres Summary

spheres is a C library typically used in User Interface, Graphics applications. spheres has no bugs, it has no vulnerabilities and it has low support. You can download it from GitHub.

The goal of this project is to write a CUDA raytracer that can handle millions of spheres as fast as possible. All those spheres have the same radius and share the same material. This is based on my optimization project Ray Tracing in One Weekend in CUDA. The current renderer can only handle scenes that fit completely in constant memory, which is 64KB in most graphic cards. The main goal of this project is to figure out how to render scenes that exceed this limit.
Support
    Quality
      Security
        License
          Reuse

            kandi-support Support

              spheres has a low active ecosystem.
              It has 8 star(s) with 3 fork(s). There are 4 watchers for this library.
              OutlinedDot
              It had no major release in the last 6 months.
              There are 1 open issues and 0 have been closed. There are no pull requests.
              It has a neutral sentiment in the developer community.
              The latest version of spheres is current.

            kandi-Quality Quality

              spheres has 0 bugs and 0 code smells.

            kandi-Security Security

              spheres has no vulnerabilities reported, and its dependent libraries have no vulnerabilities reported.
              spheres code analysis shows 0 unresolved vulnerabilities.
              There are 0 security hotspots that need review.

            kandi-License License

              spheres does not have a standard license declared.
              Check the repository for any license declaration and review the terms closely.
              OutlinedDot
              Without a license, all rights are reserved, and you cannot use the library in your applications.

            kandi-Reuse Reuse

              spheres releases are not available. You will need to build from source code and install.

            Top functions reviewed by kandi - BETA

            kandi's functional review helps you automatically verify the functionalities of the libraries and avoid rework.
            Currently covering the most popular Java, JavaScript and Python libraries. See a Sample of spheres
            Get all kandi verified functions for this library.

            spheres Key Features

            No Key Features are available at this moment for spheres.

            spheres Examples and Code Snippets

            Volume of two spheres .
            pythondot img1Lines of Code : 37dot img1License : Permissive (MIT License)
            copy iconCopy
            def vol_spheres_intersect(
                radius_1: float, radius_2: float, centers_distance: float
            ) -> float:
                """
                Calculate the volume of the intersection of two spheres.
            
                The intersection is composed by two spherical caps and therefore its vol  
            Solves a power of two spheres .
            javadot img2Lines of Code : 31dot img2License : Permissive (MIT License)
            copy iconCopy
            void solveTowerOfHanoi(char source, char helper, char destination, int n) {
                // Every time this method
                // is invoked, the number
                // of movements increases
                ++numberOfMovements;
            
                /**
                 * Base Case.
                 *
                 * If the number of d  

            Community Discussions

            QUESTION

            How do I specify a child node location relative to ARImageAnchor?
            Asked 2022-Mar-26 at 12:12

            I have a RealityKit app that is doing some basic AR image tracking. It detects a rectangular-shaped image, and I am looking to place some spherical dots at each corner of the image. I know I can create the spheres themselves using a ModelEntity, but I haven't been able to figure out how to specify the position of these relative to the established ARImageAnchor from the reference image.

            I think I just need a counterpart to SceneKit's addChildNode(SCNNode) function, which uses SCNVector3Make() to specify a position. I just haven't been able to find a way to establish a relative position and assign a child node to the ARImageAnchor outside of these SceneKit functions. Is there something built into RealityKit that would accomplish this, or is there a way to use SceneKit to place the corner dots while still using my current setup with RealityKit for the AR reference image tracking?

            ...

            ANSWER

            Answered 2022-Mar-26 at 12:12

            Try the following approach:

            Source https://stackoverflow.com/questions/71241779

            QUESTION

            How could I speed up my written python code: spheres contact detection (collision) using spatial searching
            Asked 2022-Mar-13 at 15:43

            I am working on a spatial search case for spheres in which I want to find connected spheres. For this aim, I searched around each sphere for spheres that centers are in a (maximum sphere diameter) distance from the searching sphere’s center. At first, I tried to use scipy related methods to do so, but scipy method takes longer times comparing to equivalent numpy method. For scipy, I have determined the number of K-nearest spheres firstly and then find them by cKDTree.query, which lead to more time consumption. However, it is slower than numpy method even by omitting the first step with a constant value (it is not good to omit the first step in this case). It is contrary to my expectations about scipy spatial searching speed. So, I tried to use some list-loops instead some numpy lines for speeding up using numba prange. Numba run the code a little faster, but I believe that this code can be optimized for better performances, perhaps by vectorization, using other alternative numpy modules or using numba in another way. I have used iteration on all spheres due to prevent probable memory leaks and …, where number of spheres are high.

            ...

            ANSWER

            Answered 2022-Feb-14 at 10:23

            Have you tried FLANN?

            This code doesn't solve your problem completely. It simply finds the nearest 50 neighbors to each point in your 500000 point dataset:

            Source https://stackoverflow.com/questions/71104627

            QUESTION

            R+RGL: plot of spheres and segments, segments do not zoom properly
            Asked 2022-Mar-08 at 22:57

            Please consider the snippet below. It plots a set of spheres connected by some segments. The function to draw the smooth spheres comes from the discussion at

            How to increase smoothness of spheres3d in rgl

            What puzzles me is the following: when I zoom in/out the RGL plot, the spheres and the segments behave differently. In particular, if I zoom in, the segments look rather thin with respect to the spheres, whereas they look really wide when I zoom out.

            Is there a way to correct this behavior, so that the proportion between the spheres and the segments is always respected regardless of the zoom level? Thanks a lot

            ...

            ANSWER

            Answered 2022-Mar-07 at 09:44

            Thanks for the valuable suggestions. Resorting to cylinders got the job done. For the setting up the cylinders, I really made a copy and paste of part of the discussion here

            https://r-help.stat.math.ethz.narkive.com/9X5yGnh0/r-joining-two-points-in-rgl

            Source https://stackoverflow.com/questions/71374358

            QUESTION

            Improving the performance of nested loops in C
            Asked 2022-Mar-04 at 22:02

            Given a list of spheres described by (xi, yi, ri), meaning the center of sphere i is at the point (xi, yi, 0) in three-dimensional space and its radius is ri, I want to compute all zi where zi = max { z | (xi, yi, z) is a point on any sphere }. In other words, zi is the highest point over the center of sphere i that is in any of the spheres.

            I have two arrays

            ...

            ANSWER

            Answered 2022-Mar-03 at 00:25

            When you say

            The objective is to calculate the maximum z for each point.

            I take you to mean, for the center C of each sphere, the maximum z coordinate among all the points lying directly above C (along the z axis) on any of the spheres. This is fundamentally an O(n2) problem -- there is nothing you can do to prevent the computational expense scaling with the square of the number of spheres.

            But there may be some things you can do to reduce the scaling coeffcient. Here are some possibilities:

            • Use bona fide 2D arrays (== arrays of arrays) instead arrays of pointers. It's easier to implement, more memory-efficient, and better for locality of reference:

            Source https://stackoverflow.com/questions/71329051

            QUESTION

            How to accelerate my written python code: function containing nested functions for classification of points by polygons
            Asked 2022-Feb-12 at 09:11

            I have written the following NumPy code by Python:

            ...

            ANSWER

            Answered 2021-Dec-28 at 14:11

            First of all, the algorithm can be improved to be much more efficient. Indeed, a polygon can be directly assigned to each point. This is like a classification of points by polygons. Once the classification is done, you can perform one/many reductions by key where the key is the polygon ID.

            This new algorithm consists in:

            • computing all the bounding boxes of the polygons;
            • classifying the points by polygons;
            • performing the reduction by key (where the key is the polygon ID).

            This approach is much more efficient than iterating over all the points for each polygons and filtering the attributes arrays (eg. operate_ and contact_poss). Indeed, a filtering is an expensive operation since it requires the target array (that may not fit in the CPU caches) to be fully read and then written back. Not to mention this operation requires a temporary array to be allocated/deleted if it is not performed in-place and the operation cannot benefit from being implemented with SIMD instructions on most x86/x86-64 platforms (as it requires the new AVX-512 instruction set). It is also harder to parallelize since the filtering steps are too fast for threads to be useful but steps need to be done sequentially.

            Regarding the implementation of the algorithm, Numba can be used to speed up a lot the overall computation. The main benefit of using Numba is to drastically reduce the number of expensive temporary arrays created by Numpy in your current implementation. Note that you can specify the function types to Numba so it can compile functions when it is defined. Assertions can be used to make the code more robust and help the compiler to know the size of a given dimension so to generate a significantly faster code (the JIT compiler of Numba can unroll the loops). Ternaries operators can help a bit the JIT compiler to generate a faster branch-less program.

            Note the classification can be easily parallelized using multiple threads. However, one needs to be very careful about constant propagation since some critical constants (like the shape of the working arrays and assertions) tends not to be propagated to the code executed by threads while the propagation is critical to optimize the hot loops (eg. vectorization, unrolling). Note also that creating of many threads can be expensive on machines with many cores (from 10 ms to 0.1 ms). Thus, this is often better to use a parallel implementation only on big input data.

            Here is the resulting implementation (working with both Python2 and Python3):

            Source https://stackoverflow.com/questions/70469480

            QUESTION

            Separate mesh by loose parts in threejs
            Asked 2022-Feb-10 at 16:16

            I’ve created a some basic model in Blender. It’s 4 times subdivided cube (I need faces to look like squares), then faces was split by edges (in Blender too). Then I need to separate final mesh by loose parts in threejs (if I do that in Blender the exported file is too big, like a few MB big). So each face become separate one.

            How should I do that?

            Step 1 (blender)

            Step 2 (blender)

            After step 2 each face is a separate mesh. I need to replicate step 2 in ThreeJS.

            As a result I need to explode faces of a sphere

            Here's what I have so far

            I'll need much more faces to achieve the desired result. One possible solution would be to place 2 spheres one inside another and then "explode" them simultaneosly. But I need faces to be much smaller too.

            My "explosion" code is heavily based on this: https://github.com/akella/ExplodingObjects/blob/0ed8d2668e3fe9913133382bb139c73b9d554494/src/egg.js#L178

            And here's demo: https://tympanus.net/Development/ExplodingObjects/index-heart.html

            ...

            ANSWER

            Answered 2022-Feb-10 at 16:16

            In your case I would use bufferGeometry.

            According to this showcase: https://threejs.org/examples/#webgl_buffergeometry
            16000 triangles are generated with normal orientations.
            I think you should use BufferGeometry.

            Build on top of your codePen, Here you'll find a solution to have quad faces (instead of your triangles) oriented along a sphere surface.

            The core to get the quad faces laying along the surface of a sphere:

            Source https://stackoverflow.com/questions/71006794

            QUESTION

            How to get 2D scene coordinates of a 3D object in JavaFX
            Asked 2022-Feb-02 at 12:28

            I'm trying the create a 3D subscene with objects being labelled using Label objects in a 2D overlay. I've seen similar questions to mine on this subject, and they all point to using the Node.localToScene method on the node to be labelled in the 3D space. But this doesn't seem to work for my case. I've taken example code from the FXyz FloatingLabels example here:

            FloatingLabels.java

            The Label objects need to have their positions updated as the 3D scene in modified, which I've done but when I print out the coordinates returned by the Node.localToScene method, they're much too large to be within the application scene, and so the labels are never visible in the scene. I've written an example program that illustrates the issue, set up very similarly to the FXyz sample code but I've created an extra SubScene object to hold the 2D and 3D SubScene objects in order to plant them into a larger application window with slider controls. The 3D scene uses a perspective camera and shows a large sphere with coloured spheres along the x/y/z axes, and some extra little nubs on the surface for reference:

            ...

            ANSWER

            Answered 2022-Feb-02 at 12:28

            If you follow what has been done in the link you have posted you'll make it work.

            For starters, there is one subScene, not two.

            So I've removed these lines:

            Source https://stackoverflow.com/questions/70951152

            QUESTION

            No cubemap ("material.envMap") reflection on polygon faces with orthographic cam
            Asked 2022-Jan-05 at 01:54

            Why won't a MeshPhongMaterial's envMap property work on polygonal faces when viewed through an orthographic camera?

            It works on spheres but not an IcosahedronGeometry, for example. If I set the detail parameter of the IcosahedronGeometry to 2+ (more faces), the envMap begins to show. But if I switch to perspective cam, the envMap is fully visible even with detail of 0.

            This is what it looks like with perspective cam, note the cubemap reflection of some clouds:

            This is what it looks like with orthogonal cam and detail is 0, note the lack of cubemap reflection (please ignore the warping of the image):

            Orthogonal cam, detail is 1; cubemap reflection is back:

            The only difference between these two versions of the script is the camera.

            Here's the code I'm using to create this object:

            ...

            ANSWER

            Answered 2022-Jan-05 at 01:54

            This is the expected behavior.

            • With perspective cameras, the reflective "rays" separate as they get further away from the camera, reflecting a wider angle of the envMap.
            • With an ortho camera these reflective "rays" do not separate because they're parallel. So the reflection on a flat face is a very narrow angle of the envMap.

            See this demo I quickly put together to demonstrate what you're seeing:

            • It seems to work on spheres because when the parallel orthographic "rays" bounce off a rounded surface, these rays grow wider apart. They are no longer parallel (as is the case with a Perspective camera).

            You can see the reflections still work on your demo because the faces alternate between light and dark as you rotate them. You're just looking at a much narrower segment of the envMap:

            Source https://stackoverflow.com/questions/70552834

            QUESTION

            Three spheres intersection (trilateration) with SymPy
            Asked 2021-Dec-11 at 04:46

            Is there a way to get a solution to three spheres intersection (trilateration) with SymPy? sympy.geometry doesn't have a sphere object, so a direct approach is not feasible. Can SymPy solve a system of non-linear equations as shown at Trilateration and the Intersection of Three Spheres?

            ...

            ANSWER

            Answered 2021-Nov-16 at 14:05

            Yes. There are different ways but e.g.:

            Source https://stackoverflow.com/questions/69987186

            QUESTION

            How to index nearby 3D points on the fly?
            Asked 2021-Nov-30 at 02:43

            In physics simulations (for example n-body systems) it is sometimes necessary to keep track of which particles (points in 3D space) are close enough to interact (within some cutoff distance d) in some kind of index. However, particles can move around, so it is necessary to update the index, ideally on the fly without recomputing it entirely. Also, for efficiency in calculating interactions it is necessary to keep the list of interacting particles in the form of tiles: a tile is a fixed size array (eg 32x32) where the rows and columns are particles, and almost every row-particle is close enough to interact with almost every column particle (and the array keeps track of which ones actually do interact).

            What algorithms may be used to do this?

            Here is a more detailed description of the problem:

            1. Initial construction: Given a list of points in 3D space (on the order of a few thousand to a few million, stored as array of floats), produce a list of tiles of a fixed size (NxN), where each tile has two lists of points (N row points and N column points), and a boolean array NxN which describes whether the interaction between each row and column particle should be calculated, and for which:

              a. every pair of points p1,p2 for which distance(p1,p2) < d is found in at least one tile and marked as being calculated (no missing interactions), and

              b. if any pair of points is in more than one tile, it is only marked as being calculated in the boolean array in at most one tile (no duplicates),

              and also the number of tiles is relatively small if possible (but this is less important than being able to update the tiles efficiently)

            2. Update step: If the positions of the points change slightly (by much less than d), update the list of tiles in the fastest way possible so that they still meet the same conditions a and b (this step is repeated many times)

            It is okay to keep any necessary data structures that help with this, for example the bounding boxes of each tile, or a spatial index like a quadtree. It is probably too slow to calculate all particle pairwise distances for every update step (and in any case we only care about particles which are close, so we can skip most possible pairs of distances just by sorting along a single dimension for example). Also it is probably too slow to keep a full (quadtree or similar) index of all particle positions. On the other hand is perfectly fine to construct the tiles on a regular grid of some kind. The density of particles per unit volume in 3D space is roughly constant, so the tiles can probably be built from (essentially) fixed size bounding boxes.

            To give an example of the typical scale/properties of this kind of problem, suppose there is 1 million particles, which are arranged as a random packing of spheres of diameter 1 unit into a cube with of size roughly 100x100x100. Suppose the cutoff distance is 5 units, so typically each particle would be interacting with (2*5)**3 or ~1000 other particles or so. The tile size is 32x32. There are roughly 1e+9 interacting pairs of particles, so the minimum possible number of tiles is ~1e+6. Now assume each time the positions change, the particles move a distance around 0.0001 unit in a random direction, but always in a way such that they are at least 1 unit away from any other particle and the typical density of particles per unit volume stays the same. There would typically be many millions of position update steps like that. The number of newly created pairs of interactions per step due to the movement is (back of the envelope) (10**2 * 6 * 0.0001 / 10**3) * 1e+9 = 60000, so one update step can be handled in principle by marking 60000 particles as non-interacting in their original tiles, and adding at most 60000 new tiles (mostly empty - one per pair of newly interacting particles). This would rapidly get to a point where most tiles are empty, so it is definitely necessary to combine/merge tiles somehow pretty often - but how to do it without a full rebuild of the tile list?

            P.S. It is probably useful to describe how this differs from the typical spatial index (eg octrees) scenario: a. we only care about grouping close by points together into tiles, not looking up which points are in an arbitrary bounding box or which points are closest to a query point - a bit closer to clustering that querying and b. the density of points in space is pretty constant and c. the index has to be updated very often, but most moves are tiny

            ...

            ANSWER

            Answered 2021-Nov-27 at 13:46

            I suggest the following algorithm. E.g we have cube 1x1x1 and the cutoff distance is 0.001

            1. Let's choose three base anchor points: (0,0,0) (0,1,0) (1,0,0)
            2. Associate array of size 1000 ( 1 / 0.001) with each anchor point
            3. Add three numbers into each regular point. We will store the distance between the given point and each anchor point inside these fields
            4. At the same time this distance will be used as an index in an array inside the anchor point. E.g. 0.4324 means index 432.
            5. Let's store the set of points inside of each three arrays
            6. Calculate distance between the regular point and each anchor point every time when update point
            7. Move point between sets in arrays during the update

            The given structures will give you an easy way to find all closer points: it is the intersection between three sets. And we choose these sets based on the distance between point and anchor points.

            In short, it is the intersection between three spheres. Maybe you need to apply additional filtering for the result if you want to erase the corners of this intersection.

            Source https://stackoverflow.com/questions/70026017

            Community Discussions, Code Snippets contain sources that include Stack Exchange Network

            Vulnerabilities

            No vulnerabilities reported

            Install spheres

            You can download it from GitHub.

            Support

            For any new features, suggestions and bugs create an issue on GitHub. If you have any questions check and ask questions on community page Stack Overflow .
            Find more information at:

            Find, review, and download reusable Libraries, Code Snippets, Cloud APIs from over 650 million Knowledge Items

            Find more libraries
            CLONE
          • HTTPS

            https://github.com/voxel-tracer/spheres.git

          • CLI

            gh repo clone voxel-tracer/spheres

          • sshUrl

            git@github.com:voxel-tracer/spheres.git

          • Stay Updated

            Subscribe to our newsletter for trending solutions and developer bootcamps

            Agree to Sign up and Terms & Conditions

            Share this Page

            share link