GithubHelp home page GithubHelp logo

react-native-ar / react-native-arkit Goto Github PK

View Code? Open in Web Editor NEW
1.7K 49.0 147.0 4.49 MB

React Native binding for iOS ARKit

License: MIT License

JavaScript 24.85% Objective-C 75.15%
arkit react-native augmented-reality ios objective-c

react-native-arkit's Introduction

⚠️ LOOKING FOR MAINTAINERS - This Repo is currently not maintained. Give https://github.com/ViroCommunity/viro/ a try which has been open sourced and also supports android (ARCORE) ⚠️

react-native-arkit

npm version npm downloads

React Native binding for iOS ARKit.

Made with React Native Arkit:

  • Homestory: An AI powered interior design assistant (App store)

Tutorial: How to make an ARKit app in 5 minutes using React Native

Sample Project: https://github.com/HippoAR/ReactNativeARKit

Note: ARKit is only supported by devices with A9 or later processors (iPhone 6s/7/SE/8/X, iPad 2017/Pro) on iOS 11. You also need Xcode 9 to build the project.

There is a Slack group that anyone can join for help / support / general questions.

Join Slack

Getting started

$ yarn add react-native-arkit

make sure to use the latest version of yarn (>=1.x.x)

(npm does not work properly at the moment. See #103)

Mostly automatic installation

⚠️ Currently automatic installation does not work as PocketSVG is missing. Follow the manual installation.

$ react-native link react-native-arkit

Manual installation

iOS

  1. In XCode, in the project navigator, right click LibrariesAdd Files to [your project's name]
  2. Go to node_modules ➜ add react-native-arkit/ios/RCTARKit.xcodeproj and react-native-arkit/ios/PocketSVG/PocketSVG.xcodeproj
  3. In XCode, in the project navigator, select your project. Add libRCTARKit.a and PocketSVG.framework to your project's Build PhasesLink Binary With Libraries
  4. In Tab GeneralEmbedded Binaries+ ➜ Add PocketSVG.framework ios
  5. Run your project (Cmd+R)<
iOS Project configuration

These steps are mandatory regardless of doing a manual or automatic installation:

  1. Give permissions for camera usage. In Info.plist add the following:
<key>NSCameraUsageDescription</key>
<string>Your message to user when the camera is accessed for the first time</string>
  1. ARKit only runs on arm64-ready devices so the default build architecture should be set to arm64: go to Build settingsBuild Active Architecture Only and change the value to Yes.

Usage

A simple sample React Native ARKit App

// index.ios.js

import React, { Component } from 'react';
import { AppRegistry, View } from 'react-native';
import { ARKit } from 'react-native-arkit';

export default class ReactNativeARKit extends Component {
  render() {
    return (
      <View style={{ flex: 1 }}>
        <ARKit
          style={{ flex: 1 }}
          debug
          // enable plane detection (defaults to Horizontal)
          planeDetection={ARKit.ARPlaneDetection.Horizontal}

          // enable light estimation (defaults to true)
          lightEstimationEnabled
          // get the current lightEstimation (if enabled)
          // it fires rapidly, so better poll it from outside with
          // ARKit.getCurrentLightEstimation()
          onLightEstimation={e => console.log(e.nativeEvent)}

          // event listener for (horizontal) plane detection
          onPlaneDetected={anchor => console.log(anchor)}

          // event listener for plane update
          onPlaneUpdated={anchor => console.log(anchor)}

          // arkit sometimes removes detected planes
          onPlaneRemoved={anchor => console.log(anchor)}

          // event listeners for all anchors, see [Planes and Anchors](#planes-and-anchors)
          onAnchorDetected={anchor => console.log(anchor)}
          onAnchorUpdated={anchor => console.log(anchor)}
          onAnchorRemoved={anchor => console.log(anchor)}

          // you can detect images and will get an anchor for these images
          detectionImages={[{ resourceGroupName: 'DetectionImages' }]}


          onARKitError={console.log} // if arkit could not be initialized (e.g. missing permissions), you will get notified here
        >
          <ARKit.Box
            position={{ x: 0, y: 0, z: 0 }}
            shape={{ width: 0.1, height: 0.1, length: 0.1, chamfer: 0.01 }}
          />
          <ARKit.Sphere
            position={{ x: 0.2, y: 0, z: 0 }}
            shape={{ radius: 0.05 }}
          />
          <ARKit.Cylinder
            position={{ x: 0.4, y: 0, z: 0 }}
            shape={{ radius: 0.05, height: 0.1 }}
          />
          <ARKit.Cone
            position={{ x: 0, y: 0.2, z: 0 }}
            shape={{ topR: 0, bottomR: 0.05, height: 0.1 }}
          />
          <ARKit.Pyramid
            position={{ x: 0.2, y: 0.15, z: 0 }}
            shape={{ width: 0.1, height: 0.1, length: 0.1 }}
          />
          <ARKit.Tube
            position={{ x: 0.4, y: 0.2, z: 0 }}
            shape={{ innerR: 0.03, outerR: 0.05, height: 0.1 }}
          />
          <ARKit.Torus
            position={{ x: 0, y: 0.4, z: 0 }}
            shape={{ ringR: 0.06, pipeR: 0.02 }}
          />
          <ARKit.Capsule
            position={{ x: 0.2, y: 0.4, z: 0 }}
            shape={{ capR: 0.02, height: 0.06 }}
          />
          <ARKit.Plane
            position={{ x: 0.4, y: 0.4, z: 0 }}
            shape={{ width: 0.1, height: 0.1 }}
          />
          <ARKit.Text
            text="ARKit is Cool!"
            position={{ x: 0.2, y: 0.6, z: 0 }}
            font={{ size: 0.15, depth: 0.05 }}
          />
          <ARKit.Light
            position={{ x: 1, y: 3, z: 2 }}
            type={ARKit.LightType.Omni}
            color="white"
          />
          <ARKit.Light
            position={{ x: 0, y: 1, z: 0 }}
            type={ARKit.LightType.Spot}
            eulerAngles={{ x: -Math.PI / 2 }}
            spotInnerAngle={45}
            spotOuterAngle={45}
            color="green"
          />
          <ARKit.Model
            position={{ x: -0.2, y: 0, z: 0, frame: 'local' }}
            scale={0.01}
            model={{
              scale: 1, // this is deprecated, use the scale property that is available on all 3d objects
              file: 'art.scnassets/ship.scn', // make sure you have the model file in the ios project
            }}
          />
          <ARKit.Shape
            position={{ x: -1, y: 0, z: 0 }}
            eulerAngles={{
              x: Math.PI,
            }}
            scale={0.01}
            shape={{
              // specify shape by svg! See https://github.com/HippoAR/react-native-arkit/pull/89 for details
              pathSvg: `
              <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
                <path d="M50,30c9-22 42-24 48,0c5,40-40,40-48,65c-8-25-54-25-48-65c 6-24 39-22 48,0 z" fill="#F00" stroke="#000"/>
              </svg>`,
              pathFlatness: 0.1,
              // it's also possible to specify a chamfer profile:
              chamferRadius: 5,
              chamferProfilePathSvg: `
                <path d="M.6 94.4c.7-7 0-13 6-18.5 1.6-1.4 5.3 1 6-.8l9.6 2.3C25 70.8 20.2 63 21 56c0-1.3 2.3-1 3.5-.7 7.6 1.4 7 15.6 14.7 13.2 1-.2 1.7-1 2-2 2-5-11.3-28.8-3-30.3 2.3-.4 5.7 1.8 6.7 0l8.4 6.5c.3-.4-8-17.3-2.4-21.6 7-5.4 14 5.3 17.7 7.8 1 .8 3 2 3.8 1 6.3-10-6-8.5-3.2-19 2-8.2 18.2-2.3 20.3-3 2.4-.6 1.7-5.6 4.2-6.4"/>
              `,
              extrusion: 10,
            }}
          />  
        </ARKit>
      </View>
    );
  }
}

AppRegistry.registerComponent('ReactNativeARKit', () => ReactNativeARKit);

<ARKit />-Component

Props

Prop Type Note
debug Boolean Debug mode will show the 3D axis and feature points detected.
planeDetection ARKit.ARPlaneDetection.{ Horizontal | Vertical | HorizontalVertical | None } ARKit plane detection. Defaults to Horizontal. Vertical is available with IOS 11.3
lightEstimationEnabled Boolean ARKit light estimation (defaults to false).
worldAlignment ARKit.ARWorldAlignment.{ Gravity | GravityAndHeading | Camera } ARWorldAlignmentGravity
The coordinate system's y-axis is parallel to gravity, and its origin is the initial position of the device. ARWorldAlignmentGravityAndHeading
The coordinate system's y-axis is parallel to gravity, its x- and z-axes are oriented to compass heading, and its origin is the initial position of the device. ARWorldAlignmentCamera
The scene coordinate system is locked to match the orientation of the camera. Defaults to ARKit.ARWorldAlignment.Gravity. See
origin {position, transition} Usually {0,0,0} is where you launched the app. If you want to have a different origin, you can set it here. E.g. if you set origin={{position: {0,-1, 0}, transition: {duration: 1}}} the new origin will be one meter below. If you have any objects already placed, they will get moved down using the given transition. All hit-test functions or similar will report coordinates relative to that new origin as position. You can get the original coordinates with positionAbsolute in these functions
detectionImages Array<DetectionImage> An Array of DetectionImage (see below), only available on IOS 11.3
DetectionImage

An DetectionImage is an image or image resource group that should be detected by ARKit.

See https://developer.apple.com/documentation/arkit/arreferenceimage?language=objc how to add these images.

You will then receive theses images in onAnchorDetected/onAnchorUpdated. See also Planes and Anchors for more details.

DetectionImage has these properties

Prop Type Notes
resourceGroupName String The name of the resource group

We probably will add the option to load images from other sources as well (PRs encouraged).

Events

Event Name Returns Notes
onARKitError ARKiterror will report whether an error occured while initializing ARKit. A common error is when the user has not allowed camera access. Another error is, if you use worldAlignment=GravityAndHeading and location service is turned off
onLightEstimation { ambientColorTemperature, ambientIntensity } Light estimation on every frame. Called rapidly, better use polling. See ARKit.getCurrentLightEstimation()
onFeaturesDetected { featurePoints} Detected Features on every frame (currently also not throttled). Usefull to display custom dots for detected features. You can also poll this information with ARKit.getCurrentDetectedFeaturePoints()
onAnchorDetected Anchor When an anchor (plane or image) is first detected.
onAnchorUpdated Anchor When an anchor is updated
onAnchorRemoved Anchor When an anchor is removed
onPlaneDetected Anchor When a plane anchor is first detected.
onPlaneUpdated Anchor When a detected plane is updated
onPlaneRemoved Anchor When a detected plane is removed

See Planes and Anchors for Details about anchors

Planes and Anchors

ARKit can detect different anchors in the real world:

  • plane horizontal and vertical planes
  • image, image-anchors See DetectionImage
  • face with iphone X or similar (not implemented yet)

You then will receive anchor objects in the onAnchorDetected, onAnchorUpdated, onAnchorRemoved callbacks on your <ARKit />-component.

You can use onPlaneDetected, onPlaneUpdated, onPlaneRemoved to only receive plane-anchors (may be deprecated later).

The Anchor object has the following properties:

Property Type Description
id String a unique id identifying the anchor
type String The type of the anchor (plane, image)
position { x, y, z } the position of the anchor (relative to the origin)
positionAbsolute { x, y, z } the absolute position of the anchor
eulerAngles { x, y, z } the rotation of the plane

If its a plane-anchor, it will have these additional properties:

Property Description
alignment ARKit.ARPlaneAnchorAlignment.Horizontal or ARKit.ARPlaneAnchorAlignment.Vertical
so you can check whether it was a horizontal or vertical plane
extent see https://developer.apple.com/documentation/arkit/arplaneanchor?language=objc
center see https://developer.apple.com/documentation/arkit/arplaneanchor?language=objc

image-Anchor:

Property type Description
image {name} an object with the name of the image.

Static methods

Static Methods can directly be used on the ARKit-export:

import { ARKit } from 'react-native-arkit'

//...
const result = await ARKit.hitTestSceneObjects(point);

All methods return a promise with the result.

Method Name Arguments Notes
snapshot
snapshotCamera Take a screenshot without 3d models (will save to Photo Library)
getCameraPosition Get the current position of the ARCamera
getCamera Get all properties of the ARCamera
getCurrentLightEstimation Get current light estimation { ambientColorTemperature, ambientIntensity}
getCurrentDetectedFeaturePoints Get current detected feature points (in last current frame) (array)
focusScene Sets the scene's position/rotation to where it was when first rendered (but now relative to your device's current position/rotation)
hitTestPlanes point, type check if a plane has ben hit by point ({x,y}) with detection type (any of ARKit.ARHitTestResultType). See https://developer.apple.com/documentation/arkit/arhittestresulttype?language=objc for further information
hitTestSceneObjects point check if a scene object has ben hit by point ({x,y})
isInitialized boolean check whether arkit has been initialized (e.g. by mounting). See #152 for details
isMounted boolean check whether arkit has been mounted. See #152 for details

3D-Components

This project allows you to work with 3d elements like with usual react-components. We provide some primitive shapes like cubes, spheres, etc. as well as a component to load model-files.

You can also nest components to create new Components. Child-elements will be relative to the parent:

const BigExclamationMark = ({ position, eulerAngles, color = '#ff0000' }) => (
  <ARKit.Group opacity={0.5} position={position} eulerAngles={eulerAngles}>
    <ARKit.Sphere
      position={{ x: 0, y: 0, z: 0 }}
      shape={{ radius: 0.06 }}
      material={{ diffuse: color }}
    />
    <ARKit.Cone
      position={{ x: 0, y: 0.4, z: 0 }}
      shape={{ topR: 0.1, bottomR: 0.05, height: 0.5 }}
      material={{ diffuse: color }}
    />
  </ARKit.Group>
)

// somewhere else

<BigExclamationMark
  eulerAngles={{ x: 0.2 }}
  position={{ x: 0.2, y: 0.3, z: -0.2 }}
  color="#00ff00"
/>

General props

Most 3d object have these common properties

Prop Type Description
position { x, y, z } The object's position (y is up)
scale Number The scale of the object. Defaults to 1
eulerAngles { x, y, z } The rotation in eulerAngles
id String a unique identifier. Only provide one, if you need to find the node later in hit-testing.
shape depends on object the shape of the object (will probably renamed to geometry in future versions)
material { diffuse, metalness, roughness, lightingModel, shaders } the material of the object
transition {duration: 1} Some property changes can be animated like in css transitions. Currently you can specify the duration (in seconds).

Advanced properties:

Prop Type Description
rotation TODO see scenkit documentation
orientation TODO see scenkit documentation
renderingOrder Number Order in which object is rendered. Usefull to place elements "behind" others, although they are nearer.
categoryBitMask Number / bitmask control which lights affect this object
castsShadow boolean whether this object casts shadows
constraint ARKit.Constraint.{ BillboardAxisAll | BillboardAxisX | BillboardAxisY | BillboardAxisZ | None } Constrains the node to always point to the camera

New experimental feature:

You can switch properties on mount or onmount by specifying propsOnMount and propsOnUnmount. E.g. you can scale an object on unmount:

<ARKit.Sphere
  position={{x:0,y:0,z:0}}
  scale={1}
  transition={{duration: 1}}
  propsOnUnmount={{
    scale: 0
  }}
/>

Material

Most objects take a material property with these sub-props:

Prop Type Description
diffuse { ...mapProperties } (see below) diffuse
specular { ...mapProperties } (see below) specular
displacement { ...mapProperties } (see below) displacement
normal { ...mapProperties } (see below) normal
metalness number metalness of the object
roughness number roughness of the object
doubleSided boolean render both sides, default is true
litPerPixel boolean calculate lighting per-pixel or vertex litPerPixel
lightingModel ARKit.LightingModel.* LightingModel
blendMode ARKit.BlendMode.* BlendMode
transparencyMode ARKit.TransparencyMode.* TransparencyMode
fillMode ARKit.FillMode.* FillMode
shaders Object with keys from ARKit.ShaderModifierEntryPoint.* and shader strings as values Shader modifiers
colorBufferWriteMask ARKit.ColorMask.* color mask. Set to ARKit.ColorMask.None so that an object is transparent, but receives deferred shadows.

Map Properties:

Prop Type Description
path string Currently require is not supported, so this is an absolute link to a local resource placed for example in .xcassets
color string Color string, only used if path is not provided
wrapS ARKit.WrapMode.{ Clamp | Repeat | Mirror } wrapS
wrapT ARKit.WrapMode.{ Clamp | Repeat | Mirror }  wrapT
wrap ARKit.WrapMode.{ Clamp | Repeat | Mirror }  Shorthand for setting both wrapS & wrapT
translation { x, y, z } Translate the UVs, equivalent to applying a translation matrix to SceneKit's transformContents
rotation { angle, x, y, z } Rotate the UVs, equivalent to applying a rotation matrix to SceneKit's transformContents
scale { x, y, z } Scale the UVs, equivalent to applying a scale matrix to SceneKit's transformContents

<ARKit.Group />

This Object has no geometry, but is simply a wrapper for other components. It receives all common properties like position, eulerAngles, scale, opacity, etc. but no shape or material.

Prop Type
shape { width, height, length, chamfer }

And any common object property (position, material, etc.)

Prop Type
shape { radius }
Prop Type
shape { radius, height }
Prop Type
shape { topR, bottomR, height }
Prop Type
shape { width, height, length }
Prop Type
shape { innerR, outerR, height }
Prop Type
shape { ringR, pipeR }
Prop Type
shape { capR, height }
Prop Type
shape { width, height }

Notice: planes are veritcally aligned. If you want a horizontal plane, rotate it around the x-axis.

Example:

This is a horizontal plane that only receives shadows, but is invisible otherwise:

<ARKit.Plane
    eulerAngles={{ x: Math.PI / 2 }}
    position={floorPlane.position}
    renderingOrder={9999}
    material={{
      color: '#ffffff',
      lightingModel: ARKit.LightingModel.Constant,
      colorBufferWriteMask: ARKit.ColorMask.None,
    }}
    shape={{
      width: 100,
      height: 100,
    }}
  />
Prop Type
text String
font { name, size, depth, chamfer }

<ARKit.Model />

SceneKit only supports .scn and .dae formats.

Prop Type
model { file, node, scale, alpha }

Objects currently don't take material property.

<ARKit.Shape />

Creates a extruded shape by an svg path. See #89 for details

Prop Type
shape { pathSvg, extrusion, pathFlatness, chamferRadius, chamferProfilePathSvg, chamferProfilePathFlatness }

Place lights on the scene!

You might set autoenablesDefaultLighting={false} on The <ARKit /> component to disable default lighting. You can use lightEstimationEnabled and ARKit.getCurrentLightEstimation() to find values for intensity and temperature. This produces much nicer results then autoenablesDefaultLighting.

Prop Type Description
position { x, y, z }
eulerAngles { x, y, z }
type any of ARKit.LightType see here for details
color string the color of the light
temperature Number The color temperature of the light
intensity Number The light intensity
lightCategoryBitMask Number/bitmask control which objects are lit by this light
castsShadow boolean whether to cast shadows on object
shadowMode `ARKit.ShadowMode.* Define the shadowmode. Set to ARKit.ShadowMode.Deferred to cast shadows on invisible objects (like an invisible floor plane)

Most properties described here are also supported: https://developer.apple.com/documentation/scenekit/scnlight

This feature is new. If you experience any problem, please report an issue!

HOCs (higher order components)

withProjectedPosition()

this hoc allows you to create 3D components where the position is always relative to the same point on the screen/camera, but sticks to a plane or object.

Think about a 3D cursor that can be moved across your table or a 3D cursor on a wall.

You can use the hoc like this:

const Cursor3D = withProjectedPosition()(({positionProjected, projectionResult}) => {
  if(!projectionResult) {
    // nothing has been hit, don't render it
    return null;
  }
  return (
    <ARKit.Sphere
      position={positionProjected}
      transition={{duration: 0.1}}
      shape={{
        radius: 0.1
        }}
    />
  )
})

It's recommended that you specify a transition duration (0.1s works nice), as the position gets updated rapidly, but slightly throttled.

Now you can use your 3D cursor like this:

Attach to a given detected horizontal plane

Given you have detected a plane with onPlaneDetected, you can make the cursor stick to that plane:

<Cursor3D projectPosition={{
  x: windowWidth / 2,
  y: windowHeight / 2,
  plane: "my-planeId"
  }}
/>

If you don't have the id, but want to place the cursor on a certain plane (e.g. the first or last one), pass a function for plane. This function will get all hit-results and you can return the one you need:

<Cursor3D projectPosition={{
  x: windowWidth / 2,
  y: windowHeight / 2,
  plane: (results) => results.length > 0 ? results[0] : null
  }}
/>

You can also add a property onProjectedPosition to your cursor which will be called with the hit result on every frame

It uses https://developer.apple.com/documentation/arkit/arframe/2875718-hittest with some default options. Please file an issue or send a PR if you need more control over the options here!

Attach to a given 3D object

You can attach the cursor on a 3D object, e.g. a non-horizontal-plane or similar:

Given there is some 3D object on your scene with id="my-nodeId"

<Cursor3D projectPosition={{
  x: windowWidth / 2,
  y: windowHeight / 2,
  node: "my-nodeId"
  }}
/>

Like with planes, you can select the node with a function.

E.gl you have several "walls" with ids "wall_1", "wall_2", etc.

<Cursor3D projectPosition={{
  x: windowWidth / 2,
  y: windowHeight / 2,
  node: results => results.find(r => r.id.startsWith('wall_')),
  }}
/>

It uses https://developer.apple.com/documentation/scenekit/scnscenerenderer/1522929-hittest with some default options. Please file an issue or send a PR if you need more control over the options here!

FAQ:

Which permissions does this use?

  • camera access (see section iOS Project configuration above). The user is asked for permission, as soon as you mount an <ARKit /> component or use any of its API. If user denies access, you will get an error in onARKitError
  • location service: only needed if you use ARKit.ARWorldAlignment.GravityAndHeading.

Is there an Android / ARCore version?

Not yet, but there has been a proof-of-concept: #14. We are looking for contributors to help backporting this proof-of-conept to react-native-arkit.

I have another question...

Join Slack!

Contributing

If you find a bug or would like to request a new feature, just open an issue. Your contributions are always welcome! Submit a pull request and see CONTRIBUTING.md for guidelines.

react-native-arkit's People

Contributors

alexanderwallin avatar bnjm avatar conorstrejcek avatar eduardklinger avatar gtfargo avatar jacy-chen avatar macrozone avatar nualiian avatar qftgtr avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

react-native-arkit's Issues

Examples

Thanks for your effort in putting the ARKit library for React Native can you please include some example of rendering an object or image would be very helpful.

does addModel works?

Hey, Thanks for doing this. I pulled the latest from git and try to use addModel function. I added something like this: this.arkit.addModel({ x: 0.5, y: 0.7, z: 0, fontSize: 0.1, depth: 0.05, file: '../../3dAssets/Woola.OBJ' }); but get undefined is not a object. what's file format should be? Thanks for help!

Objects completely black

Testing this out all primitives seem a solid black color instead of being shaded white like they are in the sample image. Is there a missing step in the documentation perhaps to explain how to light shapes?

[Question] - Display Plane

Hi there,

In my project I show a text that displays all information from a detected plane using the function onPlaneDetected of the ARKit component.

Is there a way to display the plane somehow?

Thanks in advance.

Cheers,
Tom

[Feature] Group

Add a ARKit.Group that can contain multiple nodes.

at start it should only be to organize multiple elements into one component, but later we can think about allowing position and rotation on that group that will affect every element inside.

Adding planes for no reason...

Planes are being added to the scene that move around for no reason. I think it's due to

- (void)renderer:(id <SCNSceneRenderer>)renderer didAddNode:(SCNNode *)node forAnchor:(ARAnchor *)anchor

in RCTARKit.m

Planes being detected should be fine, but this should be able to be disabled, as well as planes not being rendered.

Android/ARCore integration

Hello,

I know that the main purpose on this module is to provide a binding for Apple ARKit but today Google released ARCore and I'm wondering if this module will support it for Android devices (and maybe being renamed) ?

Thanks for your amazing work !

Add color?

I see there is a method for changing TextNode color in the ObjC code, and I've tried a few things and failed. Every time, it is white. What am I doing wrong?

<ARKit.Text color="rgba(0,0,0,1)"...

<ARKit.Text color r={0} g={0} b={0}...

<ARKit.Text color={{r:0,g:0,b:0}}...

Module Broken: Xcode 9 GM deprecated code

RCTARKit.m needs to be updated... beta versions of this module worked with the deprecated code, but now it won't build.

Here are the things I mostly changed (commented out is the old code, and below is the code that runs)

//ARSessionConfiguration *configuration = self.session.configuration; ARWorldTrackingConfiguration *configuration = self.session.configuration;

//ARWorldTrackingSessionConfiguration *configuration = self.session.configuration; ARWorldTrackingConfiguration *configuration = self.session.configuration;

//-(ARWorldTrackingSessionConfiguration *)configuration { -(ARWorldTrackingConfiguration *)configuration {

Pretty simple to fix, but just thought I would let you know. There are multiple instances of this happening and if you download Xcode 9GM, you should have all the red errors I did.

Plane detection callback isn't being called

I modified the example to have something like:

<ARKit
                    style={{flex: 1}}
                    onPlaneDetected={this.onPlaneDetect}
                    onPlaneUpdate={this.onPlaneDetect}
                    //onPlaneDetected={console.log}
                    //onPlaneUpdate={console.log}
                    debug // debug mode will show feature points detected and 3D axis
                    planeDetection // turn on plane detection
                    lightEstimation // turn on light estimation
                />

where there is code such as below for registering the callback in index.ios.js. But "onPlaneDetect()" doesn't get called even though a plane is detected.


export default class App extends Component {

    constructor(props) {
        super(props);
        this.onPlaneDetect = this.onPlaneDetect.bind(this);
    }

    onPlaneDetect() {
        console.log("!!! onPlaneDetect");
    }

Suggestion: Make the usage more React familiar without refs

What about changing the usage to a more React-like approach? I mean, the creation of the elements would be determined by their usage as children of the ARKit component.
It's a suggestion @qftgtr , if you agree I can PR you on this.

import React, { Component } from 'react';
import { AppRegistry, View } from 'react-native';
import ARKit from 'react-native-arkit';

export default function RNARKit() {
  return (
    <View style={{ flex: 1 }}>
      <ARKit
        style={{ flex: 1 }}
        debug
        planeDetection
        lightEstimation
        onPlaneDetected={console.log} // event listener for plane detection
        onPlaneUpdate={console.log} // event listener for plane update
      />

      <ARKit.Text x={0} y={0} z={0} width={0.1} height={0.1} length={0.1} chamfer={0.01}>
        ARKit is cool!
      </ARKit.Text>
      <ARKit.Sphere x={0.2} y={0} z={0} width={0.1} radius={0.05} />
      <ARKit.Plane x={0.4} y={0.4} z={0} width={0.1} height={0.1} />
    </View>
  );
}

AppRegistry.registerComponent('ReactNativeARKit', () => ReactNativeARKit);

getCameraPosition doesn't return camera position

The getCameraPosition method doesn't seem to return the right values.

    const cameraPosition = ARKit.getCameraPosition()

    alert(JSON.stringify(cameraPosition))

Result:

img_4a114a06f6b7-1

I have an iPhone 6s Plus.

I am looking into this, but figured I'd file an issue. If you have ideas or if your camera position works fine, please let me know, because that would be useful.

Change custom file and move around object?

Hi!
I have 2 questions!
Is it possible to change ARKit.Model file and render a different object?
is it possible to move around the object?

image

i try to set different states here, but no rerender is done...

<ARKit/ARKit.h> file not found.

How can I fix this?
I create a new React Native project and install react-native-arkit and link.
When build using xcode - > <ARKit/ARKit.h> file not found.

[Proposal] tap-on-planes-callbacks

I would propose to expose some callbacks:

onTapOnPlaneUsingExtent: is called with an array of ARHitTestResult by using ARHitTestResultTypeExistingPlaneUsingExtent (means: the boundary of the plane is taken into account)

onTapOnPlaneNoExtent: same, but extent is not used. (using ARHitTestResultTypeExistingPlane)

Alternative:

expose the hitTest-function to the react-world (with ref?). Gesture detection and tap detection is then in the responsibility of the library-user.

i will prepare a pr on this, but i would welcome feedbacks on that

[Question] Click event on plane to set an anchor

Hi there,

First of all well done for this library. It's a very exciting topic indeed and with the RN hype at the moment it will certainly gain traction in no time.

I have been playing around with ARKit and had the look at the ios source code. I can see that you used SCNNode and ARPlaneAnchor for the Plane.update function.

Is it possible to click on the mobile screen to set an anchor and get the X,Y,Z position of this point on the plane?

Thank you very much.

Cheers,
Tom

Can't display the Custom model element

Hi,

Everything works well on my iPhone except that I can't display the custom element model here :

 <ARKit.Model
       pos={{ x: -0.2, y: 0, z: 0, frame: 'local' }}
       model={{file: 'art.scnassets/ship.scn', scale: 0.01}}/>

I added the file to my XCode project by creating a new AR project in XCode and copied the art.sncassets folder to my React Native Project :

capture d ecran 2017-09-11 a 11 22 37

I think everything is setted correctly but the ship won't show :/

Does someone have an idea why ?

Thanks for your work !

[Feature] place sprites or 2d react-native views in the 3d scene

Goal is to have 2d elements like text labels that are always facing you and do or do not scale with the distance (both is useful).

Best way would be that you could just place any <View> or react-native element and its anchored with a 3d point.

We can do this also outside of react-native-arkit (rna), but rna should provide the api for this:

  • getting a callback when the camera moves or when a frame is drawn (see #49)
  • implement a function that returns the 2d point of a given 3d point (it's projection on the screen) and its distance to the screen

react-native link react-native-arkit doesn't work

For me, linking this library required running react-native link, not react-native link react-native-arkit - doing the latter resulted in:

Command `link` unrecognized. Make sure that you have run `npm install` and that you are inside a react-native project.

ARImage

Is it possible to render an image?
It seems to be part of the library, but the code file is blank and there are no examples.

[Feature] Textures

Allow to specify texture(s) to materials

Also we might think about how to attach multiple textures. At the moment we attach the same texture to every side. Maybe we create a new property materials which is just an array of material.

  • If only material is specified, attach it to every side of the geometry
  • if materials is specified, attach it as an array

[Feature] Make three.js a first class citizen — Exposing API (Camera, Surface, Light, Measurement/Scale Metrics)

It is pretty impressive how far this project has come in such a short amount of time. However, it would be great to have one imperative way of constructing 3D scenes. Three.js has been around for quite a while and with projects such as react-native-webgl that mimic a webGL webview API but stream directly to the GraphicLayer ES API, it is possible to create incredible performant 3D experiences in RN.

The expo team as done a very simple and straight forward ARKit implementation by translating the phones AR-Position to the camera position within three js. See here: https://blog.expo.io/introducing-expo-ar-mobile-augmented-reality-with-javascript-powered-by-arkit-b0d5a02ff23

Try the snack here with the expo app for performance testing: https://snack.expo.io/Hk1C_YqjW (don't forget: you need an iPhone SE, IPhone 6S or higher)

While the declarative way of adding shapes and models is great, as soon we would wish to create more abstract scenes (animations, interactions, physics etc.) this project would face a lot of replication without gaining much more surface area.

Proposal

Provide an API/Container that can hold a three.js instance which scene is feed with

  • Camera Position
  • Surface(es) Position
  • Light Source
  • Measurement/Scale Metrics (i.e. 0.1 = 10 cm)

Opportinuty

Doing so would make scene creation much simpler (three.js has years worth of tutorials) while dropping sources of bugs in the library and making i.e. the integrating of ARCore and other solutions much simpler. Lastly, this allows developers to re-use the scene code (basically three.js) on the web and none AR enabled devices (fallback).

Performance is of course a challenge — but as the GL-GPU layer is directly tapped — I wanted to put this out here.

[Performance] prevent remounting on shape change

When shape is changed, a node gets remounted instead of updated.

This prevents animating shapes via transitions and has some performance impact.

Shape should be updated in the same way like position, eulerAngles and rotation

Positioning at GPS lat,long

I'm unsure if this is a capability of ARKit, but is it possible to position an object in the scene at a fixed GPS coordinate? If so, what would it take to add support for that to this library?

Is text supported?

Can I add text somehow through this library? i.e.
Plane.addText({position..., content: 'example'});

Application arkittutorialmanual has not been registered.

Hi guys, really thanks for putting this up!

I am trying to work through this and got it working before in xcode 9 beta. however since ios11 and xcode 9 officially rolled out i have not been able to get it to work. specifically, this is what I did (manual linking procedure):

  • react-native init arkittutorialmanual
  • cd arkittutorialmanual
  • npm install --save react-native-arkit
  • copy the index.ios.js react code on the README.md of this repo to my index.ios.js
  • In XCode, in the project navigator, right click Libraries ➜ Add Files to [your project's name]
  • Go to node_modules ➜ react-native-arkit and add RCTARKit.xcodeproj
  • In XCode, in the project navigator, select your project. Add libRCTARKit.a to your project's Build Phases ➜ Link Binary With Libraries

and then when i build, it builds successfully, but the error in xcode is this::

2017-09-28 11:22:28.512648-0400 arkittutorialmanual[10423:1749982] [DYMTLInitPlatform] platform initialization successful
2017-09-28 11:22:29.042 [info][tid:main][RCTCxxBridge.mm:187] Initializing <RCTCxxBridge: 0x1d41b73e0> (parent: <RCTBridge: 0x1d40bd880>, executor: (null))
2017-09-28 11:22:29.044491-0400 arkittutorialmanual[10423:1749870] Initializing <RCTCxxBridge: 0x1d41b73e0> (parent: <RCTBridge: 0x1d40bd880>, executor: (null))
2017-09-28 11:22:29.078 [warn][tid:main][RCTBridge.m:114] Class RCTCxxModule was not exported. Did you forget to use RCT_EXPORT_MODULE()?
2017-09-28 11:22:29.078317-0400 arkittutorialmanual[10423:1749870] Class RCTCxxModule was not exported. Did you forget to use RCT_EXPORT_MODULE()?
2017-09-28 11:22:29.126 [info][tid:main][RCTRootView.m:301] Running application arkittutorialmanual ({
    initialProps =     {
    };
    rootTag = 1;
})
2017-09-28 11:22:29.125882-0400 arkittutorialmanual[10423:1749870] Running application arkittutorialmanual ({
    initialProps =     {
    };
    rootTag = 1;
})
2017-09-28 11:22:29.132145-0400 arkittutorialmanual[10423:1749870] refreshPreferences: HangTracerEnabled: 0
2017-09-28 11:22:29.132198-0400 arkittutorialmanual[10423:1749870] refreshPreferences: HangTracerDuration: 500
2017-09-28 11:22:29.132225-0400 arkittutorialmanual[10423:1749870] refreshPreferences: ActivationLoggingEnabled: 0 ActivationLoggingTaskedOffByDA:0
2017-09-28 11:22:30.046 [info][tid:com.facebook.react.JavaScript] Running application "arkittutorialmanual" with appParams: {"rootTag":1,"initialProps":{}}. __DEV__ === true, development-level warning are ON, performance optimizations are OFF
2017-09-28 11:22:30.045835-0400 arkittutorialmanual[10423:1750003] Running application "arkittutorialmanual" with appParams: {"rootTag":1,"initialProps":{}}. __DEV__ === true, development-level warning are ON, performance optimizations are OFF
2017-09-28 11:22:30.046 [error][tid:com.facebook.react.JavaScript] Application arkittutorialmanual has not been registered.

Hint: This error often happens when you're running the packager (local dev server) from a wrong folder. For example you have multiple apps and the packager is still running for the app you were working on before.
If this is the case, simply kill the old packager instance (e.g. close the packager terminal window) and start the packager in the correct app folder (e.g. cd into app folder and run 'npm start').

This error can also happen due to a require() error during initialization or failure to call AppRegistry.registerComponent.

i am not running from packager/dev server, so i think this hint doesnt apply. i have also made very very sure that i am calling AppRegistry.registerComponent correctly. so what else might be the cause of this issue please? thanks.

libRCTARKit.a not found

If follow the steps for "mostly automatic installation", I get the following error:

*** Terminating app due to uncaught exception 'RCTFatalException: Unhandled JS Exception: undefined is not an object (evaluating 'i.getCameraPosition')', reason: 'Unhandled JS Exception: undefined is not an object (evaluating 'i.getCamera..., stack:

If I follow the steps for "manual installation" and add libRCTARKit.a to the 'Link Binary With Libraries' configuration, I get the error:

'no such file or directory: (...)/Build/Products/Release-iphoneos/libRCTARKit.a''.

I pulled down the RCTARKit.xcodeproj and it looks like libRCTARKit.a has the error 'React/RCTBridgeModule.h' file not found

[Feature] load detected planes on mount

If ARKit is unmounted and remounted, it does not lose information about planes detected internally. But if you are using onPlaneDetected and onPlaneUpdate to visualize the planes detected, you won't get notified anymore.

We therefore should call onPlaneDetected on component mount for any plane that has been detected in the past (already merged with all updates).

ARKit.xx components can be used everywhere

I accidentially mounted an ARKit.Box outside of the ARKit component and did not notice, because it actually works

The reason is, that we only allow one ARKit-scene and its internally a singleton

It still feels a bit odd though ;-) should we restrict mounting these components inside the ARKit-component?

Support for custom 3D models

Would be amazing to have support for DAE or SCN files!

I don't think I have the skills to do this myself, but if anyone publishes anything, I'll see if I can contribute what I can!

[Proposal] Load model file the same as RN loads image

Use the source prop to specify the model file would be more consistent to how RN loads images. A few use cases are

1. The model file is placed in the js folder

<ARKit.Model source={require('path/to/model/file.dae')} />

2. The model file is placed in the app's resources folder.

There is a small difference here when loading images (check here). On iOS, the file extension is not included

<Image source={{uri: 'app_icon'}} />

but on Android, you need to add the asset:/ scheme:

<Image source={{uri: 'asset:/app_icon.png'}} />

I don't know why this is different and wish someone could explain it.

A proposed usage for loading model file in resources folder is,

<ARKit.Model source={{ uri: 'model.dae' }} />

3. The model file is on server

<ARKit.Model source={{ uri: http://your.server.url/model.dae }} />

@macrozone has demonstrated how to load a online model file
https://gist.github.com/macrozone/e20b9f6ab2bf529331e6019efa08e92f

Crash on startup

After installing on my existing React native app and linking, I get this cryptic crash when I open the view. Here is the log on xcode:

libsystem_kernel.dylib`__abort_with_payload:
    0x1855e00a0 <+0>:  mov    x16, #0x209
    0x1855e00a4 <+4>:  svc    #0x80
->  0x1855e00a8 <+8>:  b.lo   0x1855e00c0               ; <+32>
    0x1855e00ac <+12>: stp    x29, x30, [sp, #-0x10]!
    0x1855e00b0 <+16>: mov    x29, sp
    0x1855e00b4 <+20>: bl     0x1855c2238               ; cerror_nocancel
    0x1855e00b8 <+24>: mov    sp, x29
    0x1855e00bc <+28>: ldp    x29, x30, [sp], #0x10
    0x1855e00c0 <+32>: ret    

I am using Xcode 9 release and ios 11 release

Any way to reset?

Two situations have come up where I need to be able to reset my scene...

  1. Every now and then, for some reason, my ARKit scene just doesn't show up. I exit the application, and it works the next time. Not sure why. But if I had a reset button, the user could tap it at least without thinking the app just doesn't work.

  2. I have a button for resetting the position of the camera. By default, the app loads my scene in front of the user. And this is fine if the user's device is already facing a comfortable position when the app launches, and they stay in that relative area until they are done with the app. But the truth is that they might be on a couch facing straight ahead for awhile, and then want to lay down on their back across the couch, completely changing their position. Or they may be walking somewhere, and the scene gets further and further away. So the user needs a way to reset the scene to be right infront of them again.

Is there a way to accomplish this... or something that could be added? It seems like once a scene is first rendered, the position of everything stays static. For instance, I haven't been able to update ARKit.box positions. I can make them disappear, but not move. So I don't think recalculating the position of the camera vs where the boxes should be next time will work, as their positions will not update.

Automatic/Manual Linking doesn't work! ld: library not found for -lRCTARKit

Hi, I am using latest XCode (9.0 beta 6 (9M214v)) and latest iOS11 (11.0 15A5372a) and the linkintg is just not working at all.

Ld /Users/swyx/Library/Developer/Xcode/DerivedData/secondapp-bdwzcmqkvlyubtajfdnpdrwdcozp/Build/Intermediates.noindex/secondapp.build/Release-iphoneos/secondapp.build/Objects-normal/arm64/secondapp normal arm64
    cd /Users/swyx/Desktop/webdev/tryreactnative/secondapp/ios
    export IPHONEOS_DEPLOYMENT_TARGET=8.0
    export PATH="/Users/swyx/Downloads/Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Users/swyx/Downloads/Xcode-beta.app/Contents/Developer/usr/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
    /Users/swyx/Downloads/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch arm64 -isysroot /Users/swyx/Downloads/Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.0.sdk -L/Users/swyx/Library/Developer/Xcode/DerivedData/secondapp-bdwzcmqkvlyubtajfdnpdrwdcozp/Build/Products/Release-iphoneos -F/Users/swyx/Library/Developer/Xcode/DerivedData/secondapp-bdwzcmqkvlyubtajfdnpdrwdcozp/Build/Products/Release-iphoneos -filelist /Users/swyx/Library/Developer/Xcode/DerivedData/secondapp-bdwzcmqkvlyubtajfdnpdrwdcozp/Build/Intermediates.noindex/secondapp.build/Release-iphoneos/secondapp.build/Objects-normal/arm64/secondapp.LinkFileList -Xlinker -rpath -Xlinker @executable_path/Frameworks -miphoneos-version-min=8.0 -dead_strip -Xlinker -object_path_lto -Xlinker /Users/swyx/Library/Developer/Xcode/DerivedData/secondapp-bdwzcmqkvlyubtajfdnpdrwdcozp/Build/Intermediates.noindex/secondapp.build/Release-iphoneos/secondapp.build/Objects-normal/arm64/secondapp_lto.o -fembed-bitcode-marker -fobjc-arc -fobjc-link-runtime -ObjC -lc++ /Users/swyx/Library/Developer/Xcode/DerivedData/secondapp-bdwzcmqkvlyubtajfdnpdrwdcozp/Build/Products/Release-iphoneos/libRCTBlob.a /Users/swyx/Library/Developer/Xcode/DerivedData/secondapp-bdwzcmqkvlyubtajfdnpdrwdcozp/Build/Products/Release-iphoneos/libRCTAnimation.a -lReact /Users/swyx/Library/Developer/Xcode/DerivedData/secondapp-bdwzcmqkvlyubtajfdnpdrwdcozp/Build/Products/Release-iphoneos/libRCTAnimation.a /Users/swyx/Library/Developer/Xcode/DerivedData/secondapp-bdwzcmqkvlyubtajfdnpdrwdcozp/Build/Products/Release-iphoneos/libRCTActionSheet.a /Users/swyx/Library/Developer/Xcode/DerivedData/secondapp-bdwzcmqkvlyubtajfdnpdrwdcozp/Build/Products/Release-iphoneos/libRCTGeolocation.a /Users/swyx/Library/Developer/Xcode/DerivedData/secondapp-bdwzcmqkvlyubtajfdnpdrwdcozp/Build/Products/Release-iphoneos/libRCTImage.a /Users/swyx/Library/Developer/Xcode/DerivedData/secondapp-bdwzcmqkvlyubtajfdnpdrwdcozp/Build/Products/Release-iphoneos/libRCTLinking.a /Users/swyx/Library/Developer/Xcode/DerivedData/secondapp-bdwzcmqkvlyubtajfdnpdrwdcozp/Build/Products/Release-iphoneos/libRCTNetwork.a /Users/swyx/Library/Developer/Xcode/DerivedData/secondapp-bdwzcmqkvlyubtajfdnpdrwdcozp/Build/Products/Release-iphoneos/libRCTSettings.a /Users/swyx/Library/Developer/Xcode/DerivedData/secondapp-bdwzcmqkvlyubtajfdnpdrwdcozp/Build/Products/Release-iphoneos/libRCTText.a /Users/swyx/Library/Developer/Xcode/DerivedData/secondapp-bdwzcmqkvlyubtajfdnpdrwdcozp/Build/Products/Release-iphoneos/libRCTVibration.a /Users/swyx/Library/Developer/Xcode/DerivedData/secondapp-bdwzcmqkvlyubtajfdnpdrwdcozp/Build/Products/Release-iphoneos/libRCTWebSocket.a -lRCTARKit -Xlinker -dependency_info -Xlinker /Users/swyx/Library/Developer/Xcode/DerivedData/secondapp-bdwzcmqkvlyubtajfdnpdrwdcozp/Build/Intermediates.noindex/secondapp.build/Release-iphoneos/secondapp.build/Objects-normal/arm64/secondapp_dependency_info.dat -o /Users/swyx/Library/Developer/Xcode/DerivedData/secondapp-bdwzcmqkvlyubtajfdnpdrwdcozp/Build/Intermediates.noindex/secondapp.build/Release-iphoneos/secondapp.build/Objects-normal/arm64/secondapp


I have tried manual linking and XCode just crashes. Any ideas on what else I should do?

xCode:

Hello guys, i have a little problem. When i run the application in xcode, the stuff will be loaded but i get the message:

2017-10-19 13:39:10.802068+0200 MyFirstARKitApp[435:65378] [] nw_connection_get_connected_socket 4 Connection has no connected handler
2017-10-19 13:39:10.802115+0200 MyFirstARKitApp[435:65378] TCP Conn 0x1c417b300 Failed : error 0:61 [61]

So the content (shapes,...) cannot be loaded. The camera on the phone works and i get the debug mode with the yellow dots and the coordinate system.

Please can you help me!? :)

Thanks a lot

Can't build release

At creating a release build i get the following error:

No such file or directory: '/Users/felixbader/Library/Developer/Xcode/DerivedData/arTest-fvhvkgbiibenhyajvimoqvcjtjsv/Build/Products/Release-iphoneos/libRCTARKit.a'

Tested with a new project with React-Native 0.47.0 iOS 11 on iPhone 7.
xCode 9

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.