How to draw line between two anchors in Sceneform in ARCore?












0















I want to connect two TransformableNode on the Sceneform at ArFragment with some visible line but without using OpenGL functions. Is it possible to draw a line between two anchors (or nodes) in Sceneform in ARCore Java in Android? If it possible then how I can do this?










share|improve this question





























    0















    I want to connect two TransformableNode on the Sceneform at ArFragment with some visible line but without using OpenGL functions. Is it possible to draw a line between two anchors (or nodes) in Sceneform in ARCore Java in Android? If it possible then how I can do this?










    share|improve this question



























      0












      0








      0








      I want to connect two TransformableNode on the Sceneform at ArFragment with some visible line but without using OpenGL functions. Is it possible to draw a line between two anchors (or nodes) in Sceneform in ARCore Java in Android? If it possible then how I can do this?










      share|improve this question
















      I want to connect two TransformableNode on the Sceneform at ArFragment with some visible line but without using OpenGL functions. Is it possible to draw a line between two anchors (or nodes) in Sceneform in ARCore Java in Android? If it possible then how I can do this?







      android arcore






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Aug 21 '18 at 15:17









      Fantômas

      32.6k156388




      32.6k156388










      asked Aug 21 '18 at 15:08









      GrogzonGrogzon

      62




      62
























          2 Answers
          2






          active

          oldest

          votes


















          1














          Yes there is a way to do this:



          private void addLineBetweenHits(HitResult hitResult, Plane plane, MotionEvent motionEvent) {

          int val = motionEvent.getActionMasked();
          float axisVal = motionEvent.getAxisValue(MotionEvent.AXIS_X, motionEvent.getPointerId(motionEvent.getPointerCount() - 1));
          Log.e("Values:", String.valueOf(val) + String.valueOf(axisVal));
          Anchor anchor = hitResult.createAnchor();
          AnchorNode anchorNode = new AnchorNode(anchor);


          if (lastAnchorNode != null) {
          anchorNode.setParent(arFragment.getArSceneView().getScene());
          Vector3 point1, point2;
          point1 = lastAnchorNode.getWorldPosition();
          point2 = anchorNode.getWorldPosition();

          /*
          First, find the vector extending between the two points and define a look rotation
          in terms of this Vector.
          */
          final Vector3 difference = Vector3.subtract(point1, point2);
          final Vector3 directionFromTopToBottom = difference.normalized();
          final Quaternion rotationFromAToB =
          Quaternion.lookRotation(directionFromTopToBottom, Vector3.up());
          MaterialFactory.makeOpaqueWithColor(getApplicationContext(), new Color(0, 255, 244))
          .thenAccept(
          material -> {
          /* Then, create a rectangular prism, using ShapeFactory.makeCube() and use the difference vector
          to extend to the necessary length. */
          ModelRenderable model = ShapeFactory.makeCube(
          new Vector3(.01f, .01f, difference.length()),
          Vector3.zero(), material);
          /* Last, set the world rotation of the node to the rotation calculated earlier and set the world position to
          the midpoint between the given points . */
          Node node = new Node();
          node.setParent(anchorNode);
          node.setRenderable(model);
          node.setWorldPosition(Vector3.add(point1, point2).scaled(.5f));
          node.setWorldRotation(rotationFromAToB);
          }
          );
          lastAnchorNode = anchorNode;
          }
          }





          share|improve this answer































            0














            Other way for drawing a line by cylinder.



            private void addLineBetweenPoints(Scene scene, Vector3 from, Vector3 to) {
            // prepare an anchor position
            Quaternion camQ = scene.getCamera().getWorldRotation();
            float f1 = new float{to.x, to.y, to.z};
            float f2 = new float{camQ.x, camQ.y, camQ.z, camQ.w};
            Pose anchorPose = new Pose(f1, f2);

            // make an ARCore Anchor
            Anchor anchor = mCallback.getSession().createAnchor(anchorPose);
            // Node that is automatically positioned in world space based on the ARCore Anchor.
            AnchorNode anchorNode = new AnchorNode(anchor);
            anchorNode.setParent(scene);

            // Compute a line's length
            float lineLength = Vector3.subtract(from, to).length();

            // Prepare a color
            Color colorOrange = new Color(android.graphics.Color.parseColor("#ffa71c"));

            // 1. make a material by the color
            MaterialFactory.makeOpaqueWithColor(getContext(), colorOrange)
            .thenAccept(material -> {
            // 2. make a model by the material
            ModelRenderable model = ShapeFactory.makeCylinder(0.0025f, lineLength,
            new Vector3(0f, lineLength / 2, 0f), material);
            model.setShadowReceiver(false);
            model.setShadowCaster(false);

            // 3. make node
            Node node = new Node();
            node.setRenderable(model);
            node.setParent(anchorNode);

            // 4. set rotation
            final Vector3 difference = Vector3.subtract(to, from);
            final Vector3 directionFromTopToBottom = difference.normalized();
            final Quaternion rotationFromAToB =
            Quaternion.lookRotation(directionFromTopToBottom, Vector3.up());
            node.setWorldRotation(Quaternion.multiply(rotationFromAToB,
            Quaternion.axisAngle(new Vector3(1.0f, 0.0f, 0.0f), 90)));
            });
            }





            share|improve this answer























              Your Answer






              StackExchange.ifUsing("editor", function () {
              StackExchange.using("externalEditor", function () {
              StackExchange.using("snippets", function () {
              StackExchange.snippets.init();
              });
              });
              }, "code-snippets");

              StackExchange.ready(function() {
              var channelOptions = {
              tags: "".split(" "),
              id: "1"
              };
              initTagRenderer("".split(" "), "".split(" "), channelOptions);

              StackExchange.using("externalEditor", function() {
              // Have to fire editor after snippets, if snippets enabled
              if (StackExchange.settings.snippets.snippetsEnabled) {
              StackExchange.using("snippets", function() {
              createEditor();
              });
              }
              else {
              createEditor();
              }
              });

              function createEditor() {
              StackExchange.prepareEditor({
              heartbeatType: 'answer',
              autoActivateHeartbeat: false,
              convertImagesToLinks: true,
              noModals: true,
              showLowRepImageUploadWarning: true,
              reputationToPostImages: 10,
              bindNavPrevention: true,
              postfix: "",
              imageUploader: {
              brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
              contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
              allowUrls: true
              },
              onDemand: true,
              discardSelector: ".discard-answer"
              ,immediatelyShowMarkdownHelp:true
              });


              }
              });














              draft saved

              draft discarded


















              StackExchange.ready(
              function () {
              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f51951704%2fhow-to-draw-line-between-two-anchors-in-sceneform-in-arcore%23new-answer', 'question_page');
              }
              );

              Post as a guest















              Required, but never shown

























              2 Answers
              2






              active

              oldest

              votes








              2 Answers
              2






              active

              oldest

              votes









              active

              oldest

              votes






              active

              oldest

              votes









              1














              Yes there is a way to do this:



              private void addLineBetweenHits(HitResult hitResult, Plane plane, MotionEvent motionEvent) {

              int val = motionEvent.getActionMasked();
              float axisVal = motionEvent.getAxisValue(MotionEvent.AXIS_X, motionEvent.getPointerId(motionEvent.getPointerCount() - 1));
              Log.e("Values:", String.valueOf(val) + String.valueOf(axisVal));
              Anchor anchor = hitResult.createAnchor();
              AnchorNode anchorNode = new AnchorNode(anchor);


              if (lastAnchorNode != null) {
              anchorNode.setParent(arFragment.getArSceneView().getScene());
              Vector3 point1, point2;
              point1 = lastAnchorNode.getWorldPosition();
              point2 = anchorNode.getWorldPosition();

              /*
              First, find the vector extending between the two points and define a look rotation
              in terms of this Vector.
              */
              final Vector3 difference = Vector3.subtract(point1, point2);
              final Vector3 directionFromTopToBottom = difference.normalized();
              final Quaternion rotationFromAToB =
              Quaternion.lookRotation(directionFromTopToBottom, Vector3.up());
              MaterialFactory.makeOpaqueWithColor(getApplicationContext(), new Color(0, 255, 244))
              .thenAccept(
              material -> {
              /* Then, create a rectangular prism, using ShapeFactory.makeCube() and use the difference vector
              to extend to the necessary length. */
              ModelRenderable model = ShapeFactory.makeCube(
              new Vector3(.01f, .01f, difference.length()),
              Vector3.zero(), material);
              /* Last, set the world rotation of the node to the rotation calculated earlier and set the world position to
              the midpoint between the given points . */
              Node node = new Node();
              node.setParent(anchorNode);
              node.setRenderable(model);
              node.setWorldPosition(Vector3.add(point1, point2).scaled(.5f));
              node.setWorldRotation(rotationFromAToB);
              }
              );
              lastAnchorNode = anchorNode;
              }
              }





              share|improve this answer




























                1














                Yes there is a way to do this:



                private void addLineBetweenHits(HitResult hitResult, Plane plane, MotionEvent motionEvent) {

                int val = motionEvent.getActionMasked();
                float axisVal = motionEvent.getAxisValue(MotionEvent.AXIS_X, motionEvent.getPointerId(motionEvent.getPointerCount() - 1));
                Log.e("Values:", String.valueOf(val) + String.valueOf(axisVal));
                Anchor anchor = hitResult.createAnchor();
                AnchorNode anchorNode = new AnchorNode(anchor);


                if (lastAnchorNode != null) {
                anchorNode.setParent(arFragment.getArSceneView().getScene());
                Vector3 point1, point2;
                point1 = lastAnchorNode.getWorldPosition();
                point2 = anchorNode.getWorldPosition();

                /*
                First, find the vector extending between the two points and define a look rotation
                in terms of this Vector.
                */
                final Vector3 difference = Vector3.subtract(point1, point2);
                final Vector3 directionFromTopToBottom = difference.normalized();
                final Quaternion rotationFromAToB =
                Quaternion.lookRotation(directionFromTopToBottom, Vector3.up());
                MaterialFactory.makeOpaqueWithColor(getApplicationContext(), new Color(0, 255, 244))
                .thenAccept(
                material -> {
                /* Then, create a rectangular prism, using ShapeFactory.makeCube() and use the difference vector
                to extend to the necessary length. */
                ModelRenderable model = ShapeFactory.makeCube(
                new Vector3(.01f, .01f, difference.length()),
                Vector3.zero(), material);
                /* Last, set the world rotation of the node to the rotation calculated earlier and set the world position to
                the midpoint between the given points . */
                Node node = new Node();
                node.setParent(anchorNode);
                node.setRenderable(model);
                node.setWorldPosition(Vector3.add(point1, point2).scaled(.5f));
                node.setWorldRotation(rotationFromAToB);
                }
                );
                lastAnchorNode = anchorNode;
                }
                }





                share|improve this answer


























                  1












                  1








                  1







                  Yes there is a way to do this:



                  private void addLineBetweenHits(HitResult hitResult, Plane plane, MotionEvent motionEvent) {

                  int val = motionEvent.getActionMasked();
                  float axisVal = motionEvent.getAxisValue(MotionEvent.AXIS_X, motionEvent.getPointerId(motionEvent.getPointerCount() - 1));
                  Log.e("Values:", String.valueOf(val) + String.valueOf(axisVal));
                  Anchor anchor = hitResult.createAnchor();
                  AnchorNode anchorNode = new AnchorNode(anchor);


                  if (lastAnchorNode != null) {
                  anchorNode.setParent(arFragment.getArSceneView().getScene());
                  Vector3 point1, point2;
                  point1 = lastAnchorNode.getWorldPosition();
                  point2 = anchorNode.getWorldPosition();

                  /*
                  First, find the vector extending between the two points and define a look rotation
                  in terms of this Vector.
                  */
                  final Vector3 difference = Vector3.subtract(point1, point2);
                  final Vector3 directionFromTopToBottom = difference.normalized();
                  final Quaternion rotationFromAToB =
                  Quaternion.lookRotation(directionFromTopToBottom, Vector3.up());
                  MaterialFactory.makeOpaqueWithColor(getApplicationContext(), new Color(0, 255, 244))
                  .thenAccept(
                  material -> {
                  /* Then, create a rectangular prism, using ShapeFactory.makeCube() and use the difference vector
                  to extend to the necessary length. */
                  ModelRenderable model = ShapeFactory.makeCube(
                  new Vector3(.01f, .01f, difference.length()),
                  Vector3.zero(), material);
                  /* Last, set the world rotation of the node to the rotation calculated earlier and set the world position to
                  the midpoint between the given points . */
                  Node node = new Node();
                  node.setParent(anchorNode);
                  node.setRenderable(model);
                  node.setWorldPosition(Vector3.add(point1, point2).scaled(.5f));
                  node.setWorldRotation(rotationFromAToB);
                  }
                  );
                  lastAnchorNode = anchorNode;
                  }
                  }





                  share|improve this answer













                  Yes there is a way to do this:



                  private void addLineBetweenHits(HitResult hitResult, Plane plane, MotionEvent motionEvent) {

                  int val = motionEvent.getActionMasked();
                  float axisVal = motionEvent.getAxisValue(MotionEvent.AXIS_X, motionEvent.getPointerId(motionEvent.getPointerCount() - 1));
                  Log.e("Values:", String.valueOf(val) + String.valueOf(axisVal));
                  Anchor anchor = hitResult.createAnchor();
                  AnchorNode anchorNode = new AnchorNode(anchor);


                  if (lastAnchorNode != null) {
                  anchorNode.setParent(arFragment.getArSceneView().getScene());
                  Vector3 point1, point2;
                  point1 = lastAnchorNode.getWorldPosition();
                  point2 = anchorNode.getWorldPosition();

                  /*
                  First, find the vector extending between the two points and define a look rotation
                  in terms of this Vector.
                  */
                  final Vector3 difference = Vector3.subtract(point1, point2);
                  final Vector3 directionFromTopToBottom = difference.normalized();
                  final Quaternion rotationFromAToB =
                  Quaternion.lookRotation(directionFromTopToBottom, Vector3.up());
                  MaterialFactory.makeOpaqueWithColor(getApplicationContext(), new Color(0, 255, 244))
                  .thenAccept(
                  material -> {
                  /* Then, create a rectangular prism, using ShapeFactory.makeCube() and use the difference vector
                  to extend to the necessary length. */
                  ModelRenderable model = ShapeFactory.makeCube(
                  new Vector3(.01f, .01f, difference.length()),
                  Vector3.zero(), material);
                  /* Last, set the world rotation of the node to the rotation calculated earlier and set the world position to
                  the midpoint between the given points . */
                  Node node = new Node();
                  node.setParent(anchorNode);
                  node.setRenderable(model);
                  node.setWorldPosition(Vector3.add(point1, point2).scaled(.5f));
                  node.setWorldRotation(rotationFromAToB);
                  }
                  );
                  lastAnchorNode = anchorNode;
                  }
                  }






                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Oct 15 '18 at 12:11









                  Shubham AgrawalShubham Agrawal

                  179212




                  179212

























                      0














                      Other way for drawing a line by cylinder.



                      private void addLineBetweenPoints(Scene scene, Vector3 from, Vector3 to) {
                      // prepare an anchor position
                      Quaternion camQ = scene.getCamera().getWorldRotation();
                      float f1 = new float{to.x, to.y, to.z};
                      float f2 = new float{camQ.x, camQ.y, camQ.z, camQ.w};
                      Pose anchorPose = new Pose(f1, f2);

                      // make an ARCore Anchor
                      Anchor anchor = mCallback.getSession().createAnchor(anchorPose);
                      // Node that is automatically positioned in world space based on the ARCore Anchor.
                      AnchorNode anchorNode = new AnchorNode(anchor);
                      anchorNode.setParent(scene);

                      // Compute a line's length
                      float lineLength = Vector3.subtract(from, to).length();

                      // Prepare a color
                      Color colorOrange = new Color(android.graphics.Color.parseColor("#ffa71c"));

                      // 1. make a material by the color
                      MaterialFactory.makeOpaqueWithColor(getContext(), colorOrange)
                      .thenAccept(material -> {
                      // 2. make a model by the material
                      ModelRenderable model = ShapeFactory.makeCylinder(0.0025f, lineLength,
                      new Vector3(0f, lineLength / 2, 0f), material);
                      model.setShadowReceiver(false);
                      model.setShadowCaster(false);

                      // 3. make node
                      Node node = new Node();
                      node.setRenderable(model);
                      node.setParent(anchorNode);

                      // 4. set rotation
                      final Vector3 difference = Vector3.subtract(to, from);
                      final Vector3 directionFromTopToBottom = difference.normalized();
                      final Quaternion rotationFromAToB =
                      Quaternion.lookRotation(directionFromTopToBottom, Vector3.up());
                      node.setWorldRotation(Quaternion.multiply(rotationFromAToB,
                      Quaternion.axisAngle(new Vector3(1.0f, 0.0f, 0.0f), 90)));
                      });
                      }





                      share|improve this answer




























                        0














                        Other way for drawing a line by cylinder.



                        private void addLineBetweenPoints(Scene scene, Vector3 from, Vector3 to) {
                        // prepare an anchor position
                        Quaternion camQ = scene.getCamera().getWorldRotation();
                        float f1 = new float{to.x, to.y, to.z};
                        float f2 = new float{camQ.x, camQ.y, camQ.z, camQ.w};
                        Pose anchorPose = new Pose(f1, f2);

                        // make an ARCore Anchor
                        Anchor anchor = mCallback.getSession().createAnchor(anchorPose);
                        // Node that is automatically positioned in world space based on the ARCore Anchor.
                        AnchorNode anchorNode = new AnchorNode(anchor);
                        anchorNode.setParent(scene);

                        // Compute a line's length
                        float lineLength = Vector3.subtract(from, to).length();

                        // Prepare a color
                        Color colorOrange = new Color(android.graphics.Color.parseColor("#ffa71c"));

                        // 1. make a material by the color
                        MaterialFactory.makeOpaqueWithColor(getContext(), colorOrange)
                        .thenAccept(material -> {
                        // 2. make a model by the material
                        ModelRenderable model = ShapeFactory.makeCylinder(0.0025f, lineLength,
                        new Vector3(0f, lineLength / 2, 0f), material);
                        model.setShadowReceiver(false);
                        model.setShadowCaster(false);

                        // 3. make node
                        Node node = new Node();
                        node.setRenderable(model);
                        node.setParent(anchorNode);

                        // 4. set rotation
                        final Vector3 difference = Vector3.subtract(to, from);
                        final Vector3 directionFromTopToBottom = difference.normalized();
                        final Quaternion rotationFromAToB =
                        Quaternion.lookRotation(directionFromTopToBottom, Vector3.up());
                        node.setWorldRotation(Quaternion.multiply(rotationFromAToB,
                        Quaternion.axisAngle(new Vector3(1.0f, 0.0f, 0.0f), 90)));
                        });
                        }





                        share|improve this answer


























                          0












                          0








                          0







                          Other way for drawing a line by cylinder.



                          private void addLineBetweenPoints(Scene scene, Vector3 from, Vector3 to) {
                          // prepare an anchor position
                          Quaternion camQ = scene.getCamera().getWorldRotation();
                          float f1 = new float{to.x, to.y, to.z};
                          float f2 = new float{camQ.x, camQ.y, camQ.z, camQ.w};
                          Pose anchorPose = new Pose(f1, f2);

                          // make an ARCore Anchor
                          Anchor anchor = mCallback.getSession().createAnchor(anchorPose);
                          // Node that is automatically positioned in world space based on the ARCore Anchor.
                          AnchorNode anchorNode = new AnchorNode(anchor);
                          anchorNode.setParent(scene);

                          // Compute a line's length
                          float lineLength = Vector3.subtract(from, to).length();

                          // Prepare a color
                          Color colorOrange = new Color(android.graphics.Color.parseColor("#ffa71c"));

                          // 1. make a material by the color
                          MaterialFactory.makeOpaqueWithColor(getContext(), colorOrange)
                          .thenAccept(material -> {
                          // 2. make a model by the material
                          ModelRenderable model = ShapeFactory.makeCylinder(0.0025f, lineLength,
                          new Vector3(0f, lineLength / 2, 0f), material);
                          model.setShadowReceiver(false);
                          model.setShadowCaster(false);

                          // 3. make node
                          Node node = new Node();
                          node.setRenderable(model);
                          node.setParent(anchorNode);

                          // 4. set rotation
                          final Vector3 difference = Vector3.subtract(to, from);
                          final Vector3 directionFromTopToBottom = difference.normalized();
                          final Quaternion rotationFromAToB =
                          Quaternion.lookRotation(directionFromTopToBottom, Vector3.up());
                          node.setWorldRotation(Quaternion.multiply(rotationFromAToB,
                          Quaternion.axisAngle(new Vector3(1.0f, 0.0f, 0.0f), 90)));
                          });
                          }





                          share|improve this answer













                          Other way for drawing a line by cylinder.



                          private void addLineBetweenPoints(Scene scene, Vector3 from, Vector3 to) {
                          // prepare an anchor position
                          Quaternion camQ = scene.getCamera().getWorldRotation();
                          float f1 = new float{to.x, to.y, to.z};
                          float f2 = new float{camQ.x, camQ.y, camQ.z, camQ.w};
                          Pose anchorPose = new Pose(f1, f2);

                          // make an ARCore Anchor
                          Anchor anchor = mCallback.getSession().createAnchor(anchorPose);
                          // Node that is automatically positioned in world space based on the ARCore Anchor.
                          AnchorNode anchorNode = new AnchorNode(anchor);
                          anchorNode.setParent(scene);

                          // Compute a line's length
                          float lineLength = Vector3.subtract(from, to).length();

                          // Prepare a color
                          Color colorOrange = new Color(android.graphics.Color.parseColor("#ffa71c"));

                          // 1. make a material by the color
                          MaterialFactory.makeOpaqueWithColor(getContext(), colorOrange)
                          .thenAccept(material -> {
                          // 2. make a model by the material
                          ModelRenderable model = ShapeFactory.makeCylinder(0.0025f, lineLength,
                          new Vector3(0f, lineLength / 2, 0f), material);
                          model.setShadowReceiver(false);
                          model.setShadowCaster(false);

                          // 3. make node
                          Node node = new Node();
                          node.setRenderable(model);
                          node.setParent(anchorNode);

                          // 4. set rotation
                          final Vector3 difference = Vector3.subtract(to, from);
                          final Vector3 directionFromTopToBottom = difference.normalized();
                          final Quaternion rotationFromAToB =
                          Quaternion.lookRotation(directionFromTopToBottom, Vector3.up());
                          node.setWorldRotation(Quaternion.multiply(rotationFromAToB,
                          Quaternion.axisAngle(new Vector3(1.0f, 0.0f, 0.0f), 90)));
                          });
                          }






                          share|improve this answer












                          share|improve this answer



                          share|improve this answer










                          answered Nov 22 '18 at 20:31









                          Andrew GrowAndrew Grow

                          20638




                          20638






























                              draft saved

                              draft discarded




















































                              Thanks for contributing an answer to Stack Overflow!


                              • Please be sure to answer the question. Provide details and share your research!

                              But avoid



                              • Asking for help, clarification, or responding to other answers.

                              • Making statements based on opinion; back them up with references or personal experience.


                              To learn more, see our tips on writing great answers.




                              draft saved


                              draft discarded














                              StackExchange.ready(
                              function () {
                              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f51951704%2fhow-to-draw-line-between-two-anchors-in-sceneform-in-arcore%23new-answer', 'question_page');
                              }
                              );

                              Post as a guest















                              Required, but never shown





















































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown

































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown







                              Popular posts from this blog

                              Tonle Sap (See)

                              I get strange results when I access the Sqlitedatabase with Unity C# via XAMPP

                              Guatemaltekische Davis-Cup-Mannschaft